Qt:在QComboBox中使用枚举

时间:2013-06-06 07:15:59

标签: c++ qt combobox

我有一组需要编辑的参数,其中一些是枚举。

截至今天,我在QSpinBox中使用枚举的原始值,这根本不友好。你必须自己记住这些值并设置好的值:

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元对象“可枚举”。但是从那里开始,我不确定。

2 个答案:

答案 0 :(得分:12)

当然你总是可以对这些值进行硬编码,但是一旦你修改了这个枚举,你就必须记住改变填充你的组合框的代码。

  

我的意思是,我想我必须通过Qt声明枚举,以便它与Qt元对象“可枚举”。但是从那里开始,我不确定。

确切地说,使用内省是一个聪明的举动。使用Q_ENUMS标记枚举,然后添加Q_OBJECT宏。然后:

  • 通过Class::staticMetaObject()
  • 抓取您的班级元对象
  • 通过QMetaEnum + QMetaObject::indexOfEnumerator()
  • 获取您的枚举QMetaObject::enumerator()
  • 通过QMetaEnum::keyCount()获取密钥数量,并迭代获取密钥名称及其对应值(QMetaEnum::key()QMetaEnum::keyToValue())。

通过这种方式,您将能够以编程方式填充组合框(典型的模式是将枚举键添加为用户可见的字符串,将相应的值添加为“项目数据”,参见QComboBox'文件。)

答案 1 :(得分:5)

另一种方法,使用 QMap

使用组合框中所需的枚举值声明并填充QMap<QString, QSomeObject::SomeEnum>,然后使用QMap键的QStringList填充QComboBox。

最终通过使用QMap的value()方法结合QComboBox的currentText()方法获取用户选择的枚举值。

QSerialPort 类和 QSerialPort :: FlowControl 枚举的示例:

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