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

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.


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

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?



7

Saya memiliki masalah yang sama

Saya telah menyelesaikannya dengan

value = self.comboBox.currentText()
print value

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

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


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


-1

Saya memiliki masalah dan

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

memecahkan ini.


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

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!


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.