2010-01-13 17 views
65

Trong Qt, tôi có thể nhận được văn bản đã chọn của QComboBox bằng cách sử dụng phương thức combobox->currentText(). Làm cách nào để nhận được giá trị đã chọn?Tôi làm cách nào để có được VALUE đã chọn trong QCombobox?

Tôi đã kiểm tra trên http://qt.nokia.com/doc/4.6/qcombobox.html để được trợ giúp nhưng tôi không thể tìm thấy phương thức currentData() mà tôi dự kiến ​​sẽ tìm thấy. Tôi chỉ có thể tìm thấy combobox->currentIndex()

Có cách nào thông minh hơn để thực hiện việc này ngoài combobox->itemData(combobox->currentIndex()) không?

Trả lời

65

Dường như bạn cần làm combobox->itemData(combobox->currentIndex()) nếu bạn muốn lấy dữ liệu hiện tại của QComboBox.

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

+1

Cảm ơn bạn. Tôi chỉ sử dụng mẹo này trong chương trình của mình. –

+1

@Patrice Bernassola Tuy nhiên hoạt động chuyển đổi của loại 'QVariant': 'combobox-> itemData (combobox-> currentIndex())' là bất hợp pháp !!! Tại sao ? –

+0

Đ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 gây ra lỗi nếu QComboBox trống. – johnson

18

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 bạn cần.

có một mã ví dụ cho tình trạ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(); 
} 

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

-4

Tôi xác nhận là 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

Đợi một giây - không phải 'QComboBox :: currentText()' trả về 'QString'? Làm thế nào để bạn đến một hợp lý 'int'? Và bạn muốn làm gì với tham số 'int index'? –

15

Cái này có thể nhận được văn bản của chỉ số hiện tại:

QString cb = cbChoice ->currentText(); 
+2

Câu trả lời đúng duy nhất. – TranslucentCloud

+0

Điều này giúp ích như thế nào? 'currentText' là những gì OP nhận thức được là ... – Aconcagua

2

Đây là mã OK 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(); 
0

Tôi gặp sự cố và

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

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

9

Chức năng thành viên QComboBox :: currentData đã được thêm vào kể từ khi câu hỏi này được hỏi, hãy xem commit

+0

Đối với tài liệu xem: http://doc.qt.io/qt-5/qcombobox.html#currentData-prop. Khách sạn có sẵn từ Qt 5.2. – m4tx

4

tôi đã cùng một vấn đề

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

value = self.comboBox.currentText() 
print value 
+1

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

1

Tôi ngạc nhiên rằng không có tín hiệu 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. Đây là lớp tôi làm cho 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))); 
} 
-1

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

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

và hoạt động! Hy vọng điều đó sẽ hữu ích!

+0

chỉ mục không giống như giá trị – Vladp

0

nếu bạn đang phát triển plugin QGIS sau đó 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(); 

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

Các vấn đề liên quan