Làm cách nào để lấy được GIÁ TRỊ đã chọn từ QCombobox?


86

Trong Qt, tôi có thể lấy selected texta QComboBoxbằng combobox->currentText()phương pháp này. Làm thế nào tôi có thể nhận được selected value?

Tôi đã tìm kiếm sự trợ giúp nhưng tôi không thể tìm thấy một phương pháp currentData()mà tôi mong đợi sẽ tìm thấy. Tôi chỉ có thể tìm thấycombobox->currentIndex()

Có cách nào thông minh hơn để làm điều đó combobox->itemData(combobox->currentIndex())không?

Cập nhật: Điều này không còn cần thiết kể từ Qt 5. Một currentData()phương thức đã được thêm vào http://doc.qt.io/qt-5/qcombobox.html#currentData-prop

Câu trả lời:


85

Có vẻ như bạn cần làm combobox->itemData(combobox->currentIndex())nếu muốn nhận dữ liệu hiện tại của QComboBox.

Nếu bạn đang sử dụng lớp của riêng mình bắt nguồn từ QComboBox, bạn có thể thêm một currentData()hàm.


2
Cảm ơn. Tôi vừa mới sử dụng mẹo này trong chương trình của mình.
Brian Stinar

1
@Patrice Bernassola Tuy nhiên, hoạt động chuyển đổi kiểu 'QVariant': combobox->itemData(combobox->currentIndex())là bất hợp pháp !!! Tại sao ?
The Beast

Điều này không hoạt động nếu không có gì được chọn tức là currentIndex = -1. Nó sẽ trả về dữ liệu từ chỉ mục cuối cùng hoặc phát sinh lỗi nếu QComboBox trống.
johnson

25

Cái này có thể lấy văn bản của chỉ mục hiện tại:

QString cb = cbChoice ->currentText();

1
Làm thế nào để giúp đỡ? currentTextlà những gì OP là nhận thức đã ...
Aconcagua

22

bạn có thể đặt dữ liệu QVariant cho tất cả các mục, sau đó bạn có thể nhận được giá trị khi cần.

có một mã ví dụ cho tình huống này:

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

nhân tiện, tôi nghĩ rằng tôi đã hiểu sai câu hỏi của bạn. tôi nghĩ cách bạn lấy dữ liệu đã đủ thông minh chưa?



8

Tôi đã gặp vấn đề tương tự

Tôi đã giải quyết bằng

value = self.comboBox.currentText()
print value

1
Đó là văn bản nhãn, không phải giá trị.
mmitchell

3

Đây là mã OK của tôi trong 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

Tôi ngạc nhiên rằng không có tín hiệu được kích hoạt và có cùng một vấn đề. Tôi đã giải quyết nó bằng cách tạo một lớp con của QComboBox. Tôi nghĩ tốt hơn là tránh phải truy cập trực tiếp vào đối tượng và gọi các chức năng của nó vì điều đó có nghĩa là khớp nối chặt chẽ hơn và đi ngược lại triết lý của Qt. Vì vậy, đây là lớp tôi đã thực hiện phù hợp với tôi.

class SmartComboBox : public QComboBox {

    Q_OBJECT

private slots:

    void triggerVariantActivated(int index);

public:

    SmartComboBox(QWidget *parent);

signals:

    void activated(const QVariant &);

};

Và việc thực hiện

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

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

0

Tôi đã gặp vấn đề và

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

đã giải quyết vấn đề này.


0

nếu bạn đang phát triển các plugin QGIS thì chỉ cần

self.dlg.cbo_load_net.currentIndex()

0

Tôi đã làm điều này

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

Với điều này, bạn sẽ thấy rằng QStringList có tên _dirs được cấu trúc giống như một mảng có các thành viên mà bạn có thể truy cập thông qua một chỉ mục lên đến giá trị được trả về bởi _dirs.count ()



-1

Tôi biết tôi rất muộn nhưng đối với những người vẫn còn vấn đề đó, nó có thể được giải quyết dễ dàng. Tôi sử dụng Qt 5.3 và nó hoạt động tốt. Không cần phải tạo một chức năng hoặc tất cả những thứ đó.

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

Và nó hoạt động ! Hy vọng nó giúp !


chỉ mục không giống với giá trị
Vladp

-4

Tôi xác nhận cách dễ nhất là làm điều này:

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
Chờ một giây - không QComboBox::currentText()trở lại a QString? Làm thế nào để bạn đến một nơi hợp lý int? Và bạn muốn làm gì với tham số của mình int index?
Christian Severin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.