自定义枚举类MyType转换为QVariant失败,如何解决?
解决自定义强类型枚举转QVariant后输出为空的问题
你遇到的问题是因为Qt元对象系统默认不认识自定义的强类型枚举(enum class),导致QVariant无法正确处理它,所以输出为空。解决方法如下:
1. 声明并注册元类型
首先在枚举定义之后,用Q_DECLARE_METATYPE告诉Qt这个类型的存在:
enum class MyType : int { TYPENAME1 = 0, TYPENAME2 = 1, TYPENAME3 = 2 }; Q_DECLARE_METATYPE(MyType)
然后在程序启动的main函数中,调用qRegisterMetaType完成注册:
int main(int argc, char *argv[]) { QApplication a(argc, argv); // 注册MyType到元对象系统 qRegisterMetaType<MyType>("MyType"); // 测试示例 MyType value = MyType::TYPENAME1; qDebug() << QVariant::fromValue(value); // 现在会输出对应的数值,比如0 return a.exec(); }
2. 让qDebug输出枚举名称而非数值
如果想要输出枚举的名称(比如TYPENAME1)而不是纯数字,可以把枚举放到一个QObject子类中,并使用Q_ENUM宏:
#include <QObject> class MyEnumHolder : public QObject { Q_OBJECT public: enum class MyType : int { TYPENAME1 = 0, TYPENAME2 = 1, TYPENAME3 = 2 }; Q_ENUM(MyType) // 自动注册元类型并生成字符串映射 };
这样处理后,qDebug()输出QVariant::fromValue(MyEnumHolder::MyType::TYPENAME1)时,就会显示MyType(TYPENAME1)而不是数字,而且不需要手动调用qRegisterMetaType。
内容的提问来源于stack exchange,提问作者Irin
相关产品推荐
相关产品推荐

