Bagaimana saya bisa mendapatkan NILAI yang dipilih dari QCombobox?

87

Di Qt, saya bisa mendapatkan selected textdari a QComboBoxdengan menggunakan combobox->currentText()metode ini. Bagaimana saya bisa mendapatkan selected value?

Saya mencari bantuan tetapi saya tidak dapat menemukan metode currentData()yang saya harapkan dapat ditemukan. Saya hanya bisa menemukancombobox->currentIndex()

Apakah ada cara yang lebih cerdas untuk melakukannya selain combobox->itemData(combobox->currentIndex())?

Pembaruan: Ini tidak lagi diperlukan pada Qt 5. currentData()Metode telah ditambahkan http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

sabbour
sumber

Jawaban:

87

Sepertinya perlu Anda lakukan combobox->itemData(combobox->currentIndex())jika ingin mendapatkan data terkini dari QComboBox.

Jika Anda menggunakan kelas Anda sendiri yang diturunkan dari QComboBox, Anda dapat menambahkan currentData()fungsi.

Patrice Bernassola
sumber
2
Terima kasih. Saya baru saja menggunakan tip ini dalam program saya.
Brian Stinar
1
@Patrice Bernassola Namun pengoperasian sakelar jenis 'QVariant': combobox->itemData(combobox->currentIndex())ilegal !!! Kenapa?
The Beast
Ini tidak bekerja jika tidak ada yang dipilih yaitu currentIndex = -1. Ini akan mengembalikan data dari indeks terakhir atau memunculkan kesalahan jika QComboBox kosong.
johnson
24

Yang ini bisa mendapatkan teks indeks saat ini:

QString cb = cbChoice ->currentText();
littlecodefarmer758
sumber
3
Bagaimana ini membantu? currentTextadalah apa yang sudah diketahui OP ...
Aconcagua
23

Anda dapat mengatur data QVariant untuk semua item, kemudian Anda bisa mendapatkan nilainya saat Anda membutuhkannya.

ada contoh kode untuk situasi ini:

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

Ngomong-ngomong, saya rasa saya salah paham dengan pertanyaan Anda. Saya pikir cara Anda mendapatkan data cukup pintar?

ufukgun
sumber
11

Fungsi anggota QComboBox :: currentData telah ditambahkan sejak pertanyaan ini diajukan, lihat komit ini

joaerl
sumber
Untuk dokumentasi, lihat: doc.qt.io/qt-5/qcombobox.html#currentData-prop . Properti ini tersedia sejak Qt 5.2.
m4tx
7

Saya memiliki masalah yang sama

Saya telah menyelesaikannya dengan

value = self.comboBox.currentText()
print value
jatinkumar patel
sumber
2
Itu teks labelnya, bukan nilainya.
mmitchell
3

Ini adalah kode OK saya di 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
sumber
1

Saya heran tidak ada sinyal yang diaktifkan dan memiliki masalah yang sama. Saya menyelesaikannya dengan membuat subclass QComboBox. Saya pikir lebih baik untuk menghindari akses langsung ke objek dan memanggil fungsinya karena itu berarti penggandengan yang lebih erat dan bertentangan dengan filosofi Qt. Jadi, inilah kelas yang saya buat yang cocok untuk saya.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

Dan implementasinya

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

SmartComboBox::SmartComboBox(QWidget *parent)
:QComboBox(parent)
{
    connect(this, SIGNAL(activated(int)), this, SLOT(triggerVariantActivated(int)));
}
pinkboi.dll
sumber
1

Pertanyaannya sudah lama, tapi mungkin, seseorang membutuhkan jawaban yang sebenarnya.

Di QGIS 3.4 Anda bisa mendapatkan nilai dari metode QComboBoxwith currentData().

Contoh: comboBox.currentData()

Tautan: https://doc.qt.io/qt-5/qcombobox.html#currentData-prop

deit
sumber
0

Saya melakukan ini

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

Anda akan melihat dengan ini bahwa QStringList bernama _dirs terstruktur seperti array yang anggotanya dapat Anda akses melalui indeks hingga nilai yang dikembalikan oleh _dirs.count ()

E Purdy
sumber
-1

Saya memiliki masalah dan

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

memecahkan ini.

kiriloff
sumber
Sekali lagi, seperti yang ditulis orang lain di atas, ini adalah teks yang dipilih , BUKAN dipilih NILAI . Suatu hal yang berbeda.
Oak_3260548
-1

jika Anda mengembangkan plugin QGIS maka cukup

self.dlg.cbo_load_net.currentIndex()
Abhijit Gujar
sumber
Tidak, ini juga tidak dipilihVALUE . Dipilih TEXT, dipilih VALUEdan dipilih INDEXadalah hal yang sama sekali berbeda. Hanya secara kebetulan mungkin indexsama dengan value. Jika orang ingin menggunakan kombo, mereka perlu mempelajari dan memahami perbedaannya. Dan untuk pemahaman terbaik saya, di Qt, NILAI sedikit diperpanjang saat menggunakan model data.
Oak_3260548
-2

Saya tahu saya sangat terlambat tetapi bagi mereka yang masih memiliki masalah itu, itu bisa diselesaikan dengan mudah. Saya menggunakan Qt 5.3 dan berfungsi dengan baik. Tidak perlu membuat fungsi atau semua itu.

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

dan berhasil! Semoga membantu!

Alioum Serouis
sumber
indeks tidak sama dengan nilai
Vladp
-5

Saya mengonfirmasi cara termudah adalah dengan melakukan ini:

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
sumber
7
Tunggu sebentar - tidak QComboBox::currentText()mengembalikan QString? Bagaimana Anda sampai pada sesuatu yang masuk akal int? Dan apa yang ingin Anda lakukan dengan parameter Anda int index?
Christian Severin