我有一组需要编辑的参数,其中一些是枚举.
截至今天,我在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文档.)
另一种方法,使用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)