Wie kann ich den ausgewählten Wert aus einer QCombobox herausholen?

85

In Qt kann ich das selected textvon a QComboBoxmithilfe der combobox->currentText()Methode abrufen. Wie kann ich das bekommen selected value?

Ich suchte nach Hilfe, konnte aber keine Methode finden, currentData()die ich erwartet hatte. Ich konnte nur findencombobox->currentIndex()

Gibt es eine intelligentere Möglichkeit, dies zu tun als combobox->itemData(combobox->currentIndex())?

Update: Dies ist ab Qt 5 nicht mehr erforderlich. Eine currentData()Methode wurde hinzugefügt: http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

Sabbat
quelle

Antworten:

83

Es scheint, dass Sie dies tun müssen, combobox->itemData(combobox->currentIndex())wenn Sie die aktuellen Daten der QComboBox abrufen möchten.

Wenn Sie eine eigene Klasse verwenden, die von QComboBox abgeleitet ist, können Sie eine currentData()Funktion hinzufügen .

Patrice Bernassola
quelle
2
Vielen Dank. Ich habe diesen Tipp gerade in meinem Programm verwendet.
Brian Stinar
1
@Patrice Bernassola Allerdings ist die Schaltoperation vom Typ 'QVariant': combobox->itemData(combobox->currentIndex())illegal !!! Warum ?
Das Biest
Dies funktioniert nicht, wenn nichts ausgewählt ist, dh currentIndex = -1. Es werden entweder die Daten aus dem letzten Index zurückgegeben oder ein Fehler ausgelöst, wenn die QComboBox leer ist.
Johnson
25

Dieser kann den Text des aktuellen Index erhalten:

QString cb = cbChoice ->currentText();
littlecodefarmer758
quelle
1
Wie hilft das? currentTextist das, was das OP bereits weiß ...
Aconcagua
21

Sie können QVariant-Daten für alle Elemente festlegen und dann den Wert bei Bedarf abrufen.

Für diese Situation gibt es einen Beispielcode:

ui.comboBoxSheetSize->addItem("128 m", QVariant(128));
ui.comboBoxSheetSize->addItem("256 m", QVariant(256));
ui.comboBoxSheetSize->addItem("512 m", QVariant(512));
ui.comboBoxSheetSize->addItem("1024 m", QVariant(1024));

...

void Page::onComboSheetSizeChanged( int index )
{
 int value = ui.comboBoxSheetSize->itemData(index).toInt();
}

Übrigens, ich glaube, ich habe Ihre Frage falsch verstanden. Ich denke, die Art und Weise, wie Sie Daten erhalten, ist klug genug?

Ufukgun
quelle
11

Die Mitgliedsfunktion QComboBox :: currentData wurde hinzugefügt, seit diese Frage gestellt wurde. Siehe dieses Commit

Joerl
quelle
Dokumentation finden Sie unter: doc.qt.io/qt-5/qcombobox.html#currentData-prop . Die Eigenschaft ist seit Qt 5.2 verfügbar.
m4tx
8

Ich hatte das gleiche Problem

Ich habe gelöst durch

value = self.comboBox.currentText()
print value
Jatin
quelle
1
Das ist der Etikettentext, nicht der Wert.
mmitchell
3

Dies ist mein OK-Code in QT 4.7:

 //add combobox list 
    QString val;
   ui->startPage->clear();
    val = "http://www.work4blue.com";
    ui->startPage->addItem(tr("Navigation page"),QVariant::fromValue(val));
    val = "https://www.google.com";
    ui->startPage->addItem("www.google.com",QVariant::fromValue(val));
    val = "www.twitter.com";
    ui->startPage->addItem("www.twitter.com",QVariant::fromValue(val));
    val = "https://www.youtube.com";
    ui->startPage->addItem("www.youtube.com",QVariant::fromValue(val));

   // get current value
    qDebug() << "current value"<< 
       ui->startPage->itemData(ui->startPage->currentIndex()).toString();
bluedrum
quelle
1

Ich bin erstaunt, dass es kein aktiviertes Signal gibt und das gleiche Problem habe. Ich habe es gelöst, indem ich eine Unterklasse von QComboBox erstellt habe. Ich denke, es ist besser zu vermeiden, direkt auf das Objekt zugreifen und seine Funktionen aufrufen zu müssen, da dies eine engere Kopplung bedeutet und gegen die Philosophie von Qt verstößt. Also hier ist die Klasse, die ich gemacht habe und die für mich funktioniert.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

Und die Umsetzung

void SmartComboBox::triggerVariantActivated(int index)
{
    activated(itemData(index));
}

SmartComboBox::SmartComboBox(QWidget *parent)
:QComboBox(parent)
{
    connect(this, SIGNAL(activated(int)), this, SLOT(triggerVariantActivated(int)));
}
pinkboi
quelle
0

Ich hatte das Problem und

QString str = m_UI->myComboBox->currentText();

löste dies.

kiriloff
quelle
0

Wenn Sie QGIS-Plugins entwickeln, dann einfach

self.dlg.cbo_load_net.currentIndex()
Abhijit Gujar
quelle
0

ich war das

QDir path("/home/user/");
QStringList _dirs = path.entryList(QDir::Dirs);
std::cout << "_dirs_count = " << _dirs.count() << std::endl;
ui->cmbbox->addItem(Files);
ui->cmbbox->show();

Sie werden sehen, dass die QStringList mit dem Namen _dirs wie ein Array aufgebaut ist, auf dessen Mitglieder Sie über einen Index bis zu dem von _dirs.count () zurückgegebenen Wert zugreifen können.

E Purdy
quelle
-1

Ich weiß, dass ich sehr spät bin, aber für diejenigen, die dieses Problem noch haben, kann es leicht gelöst werden. Ich benutze Qt 5.3 und es funktioniert gut. Keine Notwendigkeit, eine Funktion oder all das zu erstellen.

int valueComboBox;
valueComboBox = comboBox->currentIndex();

und es funktioniert ! Ich hoffe es hilft !

Alioum Serouis
quelle
Index ist nicht gleich Wert
Vladp
-4

Ich bestätige, dass dies am einfachsten ist:

uiAnalyseAssets::AnalyseAssets(QWidget *parent)
: QWidget(parent)
{
ui.comboBox->addItem("text1");
ui.comboBox->addItem("text2");

...
}

void mainFunction::yourFunction( int index )
{
 int value = ui.comboBox->currentText();
}
Tarik
quelle
7
Warten Sie eine Sekunde - gibt nicht QComboBox::currentText()ein zurück QString? Wie kommst du zu einem vernünftigen int? Und was möchten Sie mit Ihrem Parameter machen int index?
Christian Severin