QT 遍历一个枚举成员
利用Qt元对象特性来对枚举与字符串转换和遍历。
- QMetaEnum类
QMetaEnum类提供有关枚举器的元数据。
返回与模板参数中的类型相对应的QMetaEnum。
QMetaEnum QMetaEnum::fromType()
注意: 枚举需要用Q_ENUM声明(如下例)。
class Object : public QObject
{
Q_OBJECT
public:
Object();
enum WeekDay {
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
Q_ENUM(WeekDay)
};
- 枚举转字符串
方法一:
通过枚举下标获取对应字符串。
const char *key(int index) const
方法二:
通过枚举的值获取对应的字符串。
const char *valueToKey(int value) const
例:
QMetaEnum metaEnum = QMetaEnum::fromTypeObject::WeekDay();
const char *weekDayStr = metaEnum.valueToKey(Object::Sunday);
qDebug() << weekDayStr; - 字符串转枚举
可以通过ok的值来判断是否正确转换。
int keyToValue(const char *key, bool *ok = nullptr) const
例:
QMetaEnum metaEnum = QMetaEnum::fromTypeObject::WeekDay();
bool isOk = false;
Object::WeekDay weekDay = (Object::WeekDay)metaEnum.keyToValue(“Sunday”,
&isOk);
if (isOk) {
qDebug() << weekDay;
} - 遍历
QStringList list;
QMetaEnum metaEnum = QMetaEnum::fromTypeObject::WeekDay();
for (int i = 0; i < metaEnum.keyCount(); i++) {
list += metaEnum.valueToKey(metaEnum.value(i));
// Or list += metaEnum.key(i);
}
qDebug() << list;
示例:
m_pBrushCb = new QComboBox(this);
m_pBrushCb->setGeometry(0,50,200,20);
//m_pBrushCb->addItem(tr("SolidPattern"),static_cast<int>(Qt::SolidPattern));
QMetaEnum metaEnum = QMetaEnum::fromType<Qt::BrushStyle>();
for (int i = 0; i < metaEnum.keyCount(); i++)
{
//metaEnum.key(i) 是枚举类型 每一个枚举成员的名称;metaEnum.value(i)是每一个枚举成员后面对应的值
m_pBrushCb->addItem(metaEnum.key(i),static_cast<int>(metaEnum.value(i)));
}
connect(m_pBrushCb,SIGNAL(activated(int)),this,SLOT(ShowBrushStyle(int)));
ShowBrushStyle的实现如下
在这里插入代码片
void Widget::ShowBrushStyle(int value)
{
Qt::BrushStyle style = Qt::BrushStyle(m_pBrushCb->itemData(value,Qt::UserRole).toInt());
int j = 0;
}