Как обновить содержимое QCombobox в QTableView

У меня есть QTableView, в одном из столбцов которого есть QComboBox. Поле со списком отображает данные из вектора, которые обновляются, когда я нажимаю кнопку. Когда я запускаю приложение, в поле со списком отображаются все элементы в векторе. Теперь я нажимаю кнопку (которая добавляет больше элементов в вектор), но поле со списком не отражает новые данные в векторе. Он по-прежнему показывает старые данные. Я также испускаю dataChanged() после обновления вектора, но не вижу никаких изменений. Функция data() получает вызов в модели, которая возвращает все элементы вектора, но setEditorData не получает вызов в делегате.

Я что-то пропустил.

Спасибо,

Дев


person dev    schedule 28.11.2011    source источник
comment
Если я правильно понимаю, вы хотите изменить элементы в раскрывающемся списке QComboBox? Если это так, вы должны обновить их вручную, потому что он не отслеживает изменения в списке элементов, которые были установлены для него. Было бы полезно, если бы вы опубликовали некоторый код, как вы устанавливаете вектор в comboBox и как вы его обновляете.   -  person firescreamer    schedule 28.11.2011
comment
Да, я хочу изменить элементы в QComboBox при обновлении вектора. Вот что я делаю, у меня есть вектор, в который я добавляю 3 элемента при инициализации. В ::data() модели я возвращаю QStringList, содержащий эти элементы. И нормально показывает. Теперь я добавляю еще несколько элементов в вектор при нажатии на кнопку. Я также испускаю dataChanged() модели сразу после добавления новых элементов в вектор. Я думаю, что мне придется поймать этот сигнал в модели и обновить содержимое поля со списком. Дайте мне знать, есть ли лучший способ сделать это. Спасибо   -  person dev    schedule 28.11.2011


Ответы (1)


Затем вам нужно сделать что-то вроде этой функции:

void updateComboBox(QComboBox *comboToUpdate, const QStringList & list )
{
    QString curentText = comboToUpdate->currntText();
    comboToUpdate->clear();
    comboToUpdate->insertItems(list);
    comboToUpdate->setCurrentIndex(comboToUpdate->findText(currentText));
}

Линии

QString currentText = comboToUpdate->currentText();
...
comboToUpdate->setCurrentIndex(comboToUpdate->findText(currentText));

являются необязательными и используются, чтобы не изменять currentItem после выбора.

person firescreamer    schedule 28.11.2011
comment
и я должен сделать это в обработчике dataChanged() на модели? - person dev; 28.11.2011
comment
Вы должны на месте знать, что вектор изменился и является лучшим на ваш взгляд. Поскольку я не знаю, как выглядит ваш код, трудно отметить лучшее место для него. - person firescreamer; 28.11.2011