2010-12-02 5 views
36

Was wäre die beste Methode zur Auswahl eines Elements in einem QT-Kombinationsfeld aus einer vordefinierten Liste von enumbasierten eindeutigen Werten.QComboBox - Ausgewähltes Element basierend auf den Daten des Elements festlegen

In der Vergangenheit habe ich den .NET-Stil der Auswahl gewöhnt haben, wo das Element können Sie, indem Sie die ausgewählte Eigenschaft auf dem Produktwert ausgewählt werden möchten wählen:

cboExample.SelectedValue = 2; 

Gibt es dies trotzdem zu tun mit QT basierend auf den Daten des Elements, wenn die Daten eine C++ - Enumeration sind?

Antwort

76

Sie Nachschlag den Wert der Daten mit Finddata und dann setCurrentIndex verwenden

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); 
} 
+0

+1, sollten Sie erwähnen, wie die Daten setzen though. –

21

Sie können auch einen Blick auf das Verfahren haben findtext (const QString & Text) von QComboBox; Es gibt den Index des Elements zurück, das den gegebenen Text enthält (-1 falls nicht gefunden). Der Vorteil dieser Methode besteht darin, dass Sie beim Hinzufügen eines Elements nicht den zweiten Parameter festlegen müssen.

Hier ist ein kleines Beispiel:

/* 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); 
+0

Die Verwendung von findText() ist nie gut. findData() sollte der bevorzugte Weg sein. – hfrmobile

+2

Ihre Aussage ist widersprüchlich. Ich stimme zu, dass findData der "bevorzugte" Weg sein sollte, aber nicht der einzige Weg. Ich schreibe Logik für ein vorhandenes System, das manchmal "einfachen" Combobox-Inhalt mit Nulldatenwerten erstellt. Normalerweise ist findData ausreichend, aber manchmal braucht man findText, wenn keine "Daten" zu finden sind. – TheGerm

1

Wenn Sie den Text in der Combo-Box kennen, die Sie auswählen möchten, verwenden Sie einfach die setCurrentText() -Methode das Element auszuwählen.

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

Von der 5.7-Dokumentation Qt

Der Setter setCurrentText() ruft einfach SetEditText(), wenn die Combo Feld bearbeitbar ist. Andernfalls wird currentIndex auf den entsprechenden Index gesetzt, wenn in der Liste ein übereinstimmender Text vorhanden ist.

Solange das Kombinationsfeld nicht bearbeitet werden kann, wird der im Funktionsaufruf angegebene Text im Kombinationsfeld ausgewählt.

Referenz: http://doc.qt.io/qt-5/qcombobox.html#currentText-prop

+0

ui-> ComboBox-> setCurrentText ("Option") ist die gültige und einfache Methode! – sonichy

+0

Vielleicht ist es bemerkenswert, dass dies in Qt 4.x nicht verfügbar ist, zumindest nicht in 4.8 – Hawkins