web-dev-qa-db-fra.com

Définir l'élément sélectionné pour QComboBox

J'ai un simple widget QComboBox, qui a 2 valeurs à l'intérieur: True et False. Et j'ai une variable QString currValue, qui est l'une de ces valeurs. Je veux définir la valeur actuelle de mon widget avec currValue.

J'ai pensé que la solution est la suivante: permet d'abord d'initialiser currValue; QString currValue = "False";

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

Mais ça ne marche pas. Est-ce que je fais quelque chose de mal ? Et pourquoi QComboBox n'a pas de membre setCurrentItem () ou smth comme ça?

18
Karen Tsirunyan

Vous devez en fait l'écrire de la manière suivante:

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

Le problème dans votre implémentation était que vous n'avez pas défini les éléments ' userData , mais uniquement du texte. En même temps, vous avez essayé de trouver un élément par son userData qui était vide. Avec l'implémentation donnée, j'utilise simplement le deuxième argument de la fonction QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())) qui définit les données utilisateur de l'élément (QVariant ).

MISE À JOUR:

L'autre façon de trouver l'élément de zone de liste déroulante consiste à définir le rôle spécifique comme deuxième argument pour la fonction QComboBox::findData(). Si vous ne souhaitez pas définir explicitement les données utilisateur, vous pouvez vous référer aux textes des articles avec le drapeau Qt::DisplayRole, À savoir:

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

MISE À JOUR 2:

Une autre alternative pourrait être d'utiliser la fonction de recherche basée sur le texte QComboBox::findText():

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

J'ai la réponse à ma propre question.

combo->setCurrentIndex(combo->findText(currValue));
5
Karen Tsirunyan