Установите выделенный элемент для QComboBox

У меня есть простой виджет QComboBox, который имеет 2 значения внутри: True и False. И у меня есть переменная QString currValue, которая является одним из этих значений. Я хочу установить текущее значение моего виджетов currValue.

Я думал, что это решение: сначала позволяет инициализировать currValue; QString currValue = "False";

QComboBox* combo = new QComboBox();
combo->addItem("True");
combo->addItem("False");
combo->setCurrentIndex(combo->findData(currValue));

Но это не сработает. Я делаю что-то неправильно? И почему у QComboBox нет члена setCurrentItem() или smth?

Ответ 1

Вам действительно нужно записать его следующим образом:

QComboBox* combo = new QComboBox();
combo->addItem("True", "True");
combo->addItem("False", "False");
combo->setCurrentIndex(combo->findData("False"));

Проблема в вашей реализации заключалась в том, что вы не установили userData элементов, а только текст. В то же время вы пытались найти элемент по его userData, который был пуст. С данной реализацией я просто использую второй аргумент функции QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())), который устанавливает элемент userData (QVariant).

UPDATE:

Альтернативный способ найти элемент со списком задает определенную роль как второй аргумент для функции QComboBox::findData(). Если вы не хотите явно устанавливать пользовательские данные, вы можете ссылаться на тексты элементов с флагом Qt::DisplayRole, то есть:

QComboBox* combo = new QComboBox();
combo->addItem("True");
combo->addItem("False");
combo->setCurrentIndex(combo->findData("False", Qt::DisplayRole)); // <- refers to the item text

ОБНОВЛЕНИЕ 2:

Другой альтернативой может быть использование функции поиска по тексту QComboBox::findText():

QComboBox* combo = new QComboBox();
combo->addItem("True");
combo->addItem("False");
combo->setCurrentIndex(combo->findText("False"));

Ответ 2

У меня есть ответ на мой собственный вопрос.

combo->setCurrentIndex(combo->findText(currValue));