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

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 .


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();

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?



8

Ich hatte das gleiche Problem

Ich habe gelöst durch

value = self.comboBox.currentText()
print value

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();

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

0

Ich hatte das Problem und

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

löste dies.


0

Wenn Sie QGIS-Plugins entwickeln, dann einfach

self.dlg.cbo_load_net.currentIndex()

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.



-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 !


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();
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.