Qt:在QComboBox中使用枚举

Gui*_*i13 11 c++ qt combobox

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

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

我的参数编辑器

例如,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;
Run Code Online (Sandbox Code Playgroud)

我没有找到任何关于在QComboBox中使用枚举的信息.可能吗?
如果是,步骤是什么?

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

pep*_*ppe 12

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

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

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

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

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

  • 我很惊讶Qt不包含这个作为QComboBox的标准方法?! (3认同)
  • 因为它很容易做到,而且非常具体而不是真正的通用目的.但我鼓励你继续[提交补丁](http://qt-project.org/contribute),然后说服我这是值得的:-) (2认同)

Cha*_*ter 5

另一种方法,使用QMap:

QMap<QString, QSomeObject::SomeEnum>在组合框中声明并填充a 所需的枚举值,然后使用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()));
Run Code Online (Sandbox Code Playgroud)