2013-10-17 5 views
10

Ich habe ein einfaches QComboBox Widget, das 2 Werte innerhalb hat: True und False. Und ich habe eine QString-Variable currValue, die einer dieser Werte ist. Ich möchte den aktuellen Wert meines Widgets mit currValue festlegen.Ausgewählten Artikel für QComboBox einstellen

Ich dachte, dass die Lösung die folgende ist: zuerst lässt currValue initialisieren; QString currValue = "False";

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

Aber es funktioniert nicht. Mache ich etwas falsch? Und warum QComboBox hat kein Mitglied setCurrentItem() oder etw so?

Antwort

22

Sie müssen tatsächlich in der folgenden Art und Weise schreiben:

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

Das Problem bei der Implementierung war, dass Sie nicht die Einzelteile Userdata gesetzt haben, sondern nur Text. In der gleichen Zeit haben Sie versucht, Artikel durch seine userData, die leer war zu finden. Mit der angegebenen Implementierung verwende ich nur das zweite Argument der QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())) Funktion, die userData (QVariant) des Elements setzt.

UPDATE:

Der alternative Weg, um das Kombinationsfeld Artikel zu finden, ist die spezifische Rolle als zweites Argument Einstellung für QComboBox::findData() Funktion. Wenn Sie nicht explizit die Benutzerdaten eingeben möchten, können Sie den Artikel Texte mit Qt::DisplayRole Flagge beziehen, das heißt:

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

UPDATE 2:

Eine weitere Alternative textbasierte Lookup verwenden könnte Funktion QComboBox::findText():

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

Warum?! Was bedeuten 2 gleiche Argumente? –

+0

@KarenTsirunyan, ich habe meine Antwort mit weiteren Details aktualisiert. – vahancho

+0

Ich verstehe. Aber in diesem Fall denke ich, dass es verwirrend ist, dass wenn ich nur Texte habe und ich keine Daten benötige, ich auch Daten beim Hinzufügen neuer Elemente einstellen muss. Ich denke, da MUSS es einfacher sein, den ausgewählten Text auszuwählen. –

3

Ich habe Antwort auf meine eigene Frage.

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