2013-06-06 39 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