QComboBox - установить выбранный элемент на основе данных элемента

Каким будет лучший способ выбрать элемент в поле со списком QT из предопределенного списка уникальных значений на основе enum.

В прошлом я привык к стилю выбора .NET, в котором элемент можно выбрать, установив для свойства selected значение элемента, который вы хотите выбрать:

cboExample.SelectedValue = 2;

Есть ли способ сделать это с QT на основе данных элемента, если данные являются перечислением C ++?


person cweston    schedule 02.12.2010    source источник


Ответы (3)


Вы ищите значение данных с помощью findData(), а затем используете setCurrentIndex()

QComboBox* combo = new QComboBox;
combo->addItem("100",100.0);    // 2nd parameter can be any Qt type
combo->addItem .....

float value=100.0;
int index = combo->findData(value);
if ( index != -1 ) { // -1 for not found
   combo->setCurrentIndex(index);
}
person Martin Beckett    schedule 02.12.2010

Вы также можете взглянуть на метод findText (const QString & text) из QComboBox; он возвращает индекс элемента, который содержит данный текст (-1, если не найден). Преимущество использования этого метода заключается в том, что вам не нужно устанавливать второй параметр при добавлении элемента.

Вот небольшой пример:

/* Create the comboBox */
QComboBox   *_comboBox = new QComboBox;

/* Create the ComboBox elements list (here we use QString) */
QList<QString> stringsList;
stringsList.append("Text1");
stringsList.append("Text3");
stringsList.append("Text4");
stringsList.append("Text2");
stringsList.append("Text5");

/* Populate the comboBox */
_comboBox->addItems(stringsList);

/* Create the label */
QLabel *label = new QLabel;

/* Search for "Text2" text */
int index = _comboBox->findText("Text2");
if( index == -1 )
    label->setText("Text2 not found !");
else
    label->setText(QString("Text2's index is ")
                   .append(QString::number(_comboBox->findText("Text2"))));

/* setup layout */
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(_comboBox);
layout->addWidget(label);
person Aloïké Go    schedule 30.03.2012
comment
Использование findText () никогда не годится. findData () должен быть предпочтительным способом. - person hfrmobile; 07.03.2017
comment
Ваше утверждение противоречиво. Я согласен с тем, что findData должен быть предпочтительным, но не единственным способом. Я пишу логику для существующей системы, которая иногда создает простое содержимое поля со списком с нулевыми значениями данных. Так что обычно findData достаточно, но иногда вам нужен findText, когда нет данных для поиска. - person TheGerm; 14.06.2017

Если вы знаете текст в поле со списком, который хотите выделить, просто используйте метод setCurrentText (), чтобы выбрать этот элемент.

ui->comboBox->setCurrentText("choice 2");

Из документации Qt 5.7

Установщик setCurrentText () просто вызывает setEditText (), если поле со списком доступно для редактирования. В противном случае, если в списке есть совпадающий текст, currentIndex устанавливается на соответствующий индекс.

Таким образом, пока поле со списком нельзя редактировать, текст, указанный в вызове функции, будет выбран в поле со списком.

Ссылка: http://doc.qt.io/qt-5/qcombobox.html#currentText-prop

person DowntownDev    schedule 08.12.2016
comment
ui- ›comboBox-› setCurrentText (option) - правильный и простой метод! - person sonichy; 29.05.2017
comment
Возможно, стоит отметить, что это недоступно в Qt 4.x, по крайней мере, не в 4.8. - person Hawkins; 27.02.2018