2013-06-06 37 views
9

我有一組需要編輯的參數,其中一些是枚舉。Qt:在QComboBox中使用枚舉

截至今日,我在QSpinBox中使用enum的原始值,這根本不友好。你必須自己記住的值,並設置好一個:

my parameter editor

例如,E_Range可以呈現組合框與這些:

typedef enum { 
    ERANGE_2_5 = 0, /*!< +/- 2.5 V */ 
    ERANGE_5 = 1, /*!< +/- 5 V */ 
    ERANGE_10 = 2, /*!< +/- 10 V */ 
    ERANGE_AUTO = 3 /*!< Auto range */ 
} TVoltageRange_e; 

我沒有找到任何使用QComboBox中的枚舉。可能嗎?
如果是,步驟是什麼?

我的意思是,我想我將不得不通過Qt聲明枚舉,以便它與Qt元對象「可枚舉」。但從那裏,我不確定。

+0

你試試這個? http://www.qtcentre。org/threads/49122-Joining-together-a-QComboBox-QStringList-enum – NightWhisper

+0

我偶然發現了這個,但對這個方法並不滿意:我認爲它太具體了。我想要有通用組件。 – Gui13

回答

11

當然,您可以始終對值進行硬編碼,但只要修改該枚舉值,就必須記住更改填充組合框的代碼。

我的意思是,我想我必須通過Qt聲明枚舉,以便它與Qt元對象「可枚舉」。但從那裏,我不確定。

確切地說,使用內省是一個明智之舉。用Q_ENUMS標記枚舉並添加Q_OBJECT宏。然後:

  • 抓住通過Class::staticMetaObject()
  • 類元對象通過QMetaObject::indexOfEnumerator() + QMetaObject::enumerator()
  • 獲取QMetaEnum您枚舉通過QMetaEnum::keyCount()獲取密鑰的數量,並重復拿到鑰匙的名稱和相應的值( QMetaEnum::key()QMetaEnum::keyToValue())。

有了這個,你就可以以編程方式填充您的組合框(典型模式是添加枚舉密鑰作爲用戶可見的字符串和相應的值作爲其「項目數據」,參見QComboBox的文檔)

+1

我很驚訝Qt不包括這個作爲QComboBox的標準方法?! – Gui13

+2

因爲它很容易做到,而且太具體,不能真正成爲通用目的。但我鼓勵你繼續並[提交補丁](http://qt-project.org/contribute),然後說服我這是值得的:-) – peppe

+0

如果像我這樣的人對如何使用metaobject的,有一個很好的教程,如何將枚舉值轉換爲Qstring [這裏](https://srikanthsombhatla.wordpress.com/2010/08/13/convert-enum-to-qstring/) –

5

的其他方式,使用QMAP

申報,並填寫與您在組合框中的枚舉值QMap<QString, QSomeObject::SomeEnum>,然後用QMAP的鍵的QStringList中填寫您的QComboBox。

最終通過使用QMap的value()方法和QComboBox的currentText()方法,獲得用戶選擇的枚舉值。

QSerialPort類和QSerialPort ::流量控制枚舉的例子:

QMap<QString, QSerialPort::FlowControl> *flowControlOptions = new QMap<QString, QSerialPort::FlowControl>; 

flowControlOptions->insert("None",QSerialPort::NoFlowControl); 
flowControlOptions->insert("Software",QSerialPort::SoftwareControl); 
flowControlOptions->insert("Hardware",QSerialPort::HardwareControl); 

QComboBox *flowControl = new QComboBox; 

flowControl->addItems(QStringList(flowControlOptions->keys())); 
flowControl->setCurrentIndex(2); 

QSerialPort *sPort = new QSerialPort; 

// Some code after... The user has selected an option 

sPort->setFlowControl(flowControlOptions->value(flowControl->currentText())); 
+0

我是這種方法的一個更大的粉絲,因爲實際的枚舉變量名稱可能是用戶顯示的一個糟糕的候選人。例如,我的變量具有下劃線,但用戶不希望沒有下劃線。 – Mikhail