14

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

截至今天,我在 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;

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

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

4

2 回答 2

12

当然,您始终可以对值进行硬编码,但是一旦修改了该枚举,您就必须记住更改填充组合框的代码。

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

确切地说,使用内省是明智之举。用标记枚举Q_ENUMS并添加Q_OBJECT宏。然后:

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

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

于 2013-06-06T07:27:12.090 回答
9

另一种方式,使用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()));
于 2015-03-02T16:05:02.863 回答