2014-09-18 5 views
3

Мне нужно получить QStringList или массив, содержащий все QString s в QComboBox.Получить содержимое QComboBox

Невозможно найти способ QComboBox, который делает это, на самом деле я даже не могу найти метод QAbstractItemModel, который делает это.

Это действительно мой единственный вариант:

std::vector<QString> list(myQComboBox.count()); 

for(auto i = 0; i < list.size(); i++) 
{ 
    list[i] = myQComboBox.itemText(i); 
} 
+1

Нет такой функции, AFAK. Почему вам не нравится подход, который вы используете (итерация по всем элементам в поле со списком)? – vahancho

+0

@vahancho Я предполагаю, что это довольно расточительно, тем более, что размер 'QComboBox' растет. –

+0

Но, может быть, хранение содержимого поля со списком в другой контейнер также расточительно? Зачем тебе это надо? Это может объяснить, почему в API нет такой функции. – vahancho

ответ

3

QAbstractItemModel может содержать изображения, деревья другие виды данных, которые могут храниться в QVariant. Вот почему вы не можете получить от него QStringList. Это бессмысленно.

Однако существует класс QStringListModel, унаследованный от QAbstractItemModel, который предназначен для хранения строк. И как вы можете ожидать, у него есть метод stringList().

QComboBox позволяет изменить модель по умолчанию, которую она использует, на другую. По умолчанию используется QStandardItemModel. Измените его на модель списка строк после создания поля со списком.

QStringListModel* cbModel = new QStringListModel(); 
comboBox->setModel(cbModel); 

Теперь вы можете получить то, что вы хотите:

QStringList list = cbModel->stringList(); 
+0

Это не решение, на которое я надеялся, но он действительно решает проблему. –

2

Не делать преждевременные оптимизации. Ваш код в порядке. Вы можете использовать qobject_cast<QStandardItemModel*>(combo.model());, чтобы получить расширенный доступ к данным combobox.

Кроме того, вы можете реализовать свой собственный QAbstractItemModel, который будет хранить данные как QStringList и предоставлять к нему доступ.

2

Ваш ответ выглядит хорошо, но вы также можете использовать QStringList вместо вектора.

QStringList itemsInComboBox; 
for (int index = 0; index < ui->combo_box->count(); index++) 
    itemsInComboBox << ui->combo_box->itemText(index);