我有一组需要编辑的参数,其中一些是枚举。
截至今天,我在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元对象“可枚举”。但是从那里开始,我不确定。
答案 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()));