QComboBox - ensemble élément sélectionné basée sur les données de l'élément
-
30-09-2019 - |
Question
Quelle serait la meilleure façon de sélectionner un élément dans une zone de liste déroulante QT sur une liste prédéfinie de enum
base des valeurs uniques.
Dans le passé, je me suis habitué au style de .NET de sélection où l'élément peut être sélectionné en définissant la propriété sélectionnée à la valeur de l'élément que vous souhaitez sélectionner:
cboExample.SelectedValue = 2;
Y at-il de toute façon de le faire avec QT en fonction des données de l'élément, si les données sont une énumération C ++?
La solution
Vous lookup 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);
}
Autres conseils
Vous pouvez également jeter un oeil à la méthode findText (const QString & text) de QComboBox; il renvoie l'index de l'élément qui contient le texte donné, (-1 si elle est introuvable). L'avantage de cette méthode est que vous n'avez pas besoin de définir le second 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);
Si vous connaissez le texte dans la zone de liste déroulante que vous voulez sélectionner, il suffit d'utiliser la méthode setCurrentText () pour sélectionner cet élément.
ui->comboBox->setCurrentText("choice 2");
A partir de la documentation de Qt 5.7
Le setCurrentText setter () appelle simplement setEditText () si le combo boîte est modifiable. Dans le cas contraire, s'il y a un texte correspondant dans la liste, currentIndex est fixé à l'indice correspondant.
Donc, tant que la zone de liste déroulante n'est pas modifiable, le texte spécifié dans l'appel de fonction sera sélectionnée dans la zone de liste déroulante.
Référence: http://doc.qt.io/qt -5 / qcombobox.html # currentText-prop