web-dev-qa-db-fra.com

QComboBox - définir l'élément sélectionné en fonction des données de l'élément

Quelle serait la meilleure façon de sélectionner un élément dans une zone de liste déroulante QT dans une liste prédéfinie de valeurs uniques basées sur enum.

Dans le passé, je me suis habitué au style de sélection de .NET où l'élément peut être sélectionné en définissant la propriété sélectionnée sur la valeur de l'élément que vous souhaitez sélectionner:

cboExample.SelectedValue = 2;

Est-il possible de le faire avec QT en fonction des données de l'élément, si les données sont une énumération C++?

48
cweston

Vous recherchez la valeur des données avec findData() puis utilisez 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);
}
97
Martin Beckett

Vous pouvez également consulter la méthode findText (const QString & text) de QComboBox; il retourne l'index de l'élément qui contient le texte donné, (-1 s'il n'est pas trouvé). L'avantage de cette méthode est que vous n'avez pas besoin de définir le deuxième paramètre lorsque vous ajoutez un élément.

Voici un petit exemple:

/* 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);
22
Aloïké Go

Si vous connaissez le texte de la zone de liste déroulante que vous souhaitez sélectionner, utilisez simplement la méthode setCurrentText () pour sélectionner cet élément.

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

De la documentation Qt 5.7

Le setter setCurrentText () appelle simplement setEditText () si la zone de liste modifiable est modifiable. Sinon, s'il y a un texte correspondant dans la liste, currentIndex est défini sur l'index correspondant.

Ainsi, tant que la zone de liste modifiable n'est pas modifiable, le texte spécifié dans l'appel de fonction sera sélectionné dans la zone de liste modifiable.

Référence: http://doc.qt.io/qt-5/qcombobox.html#currentText-prop

3
Hard.Core.Coder