我有一个代码,它可以在Qt 5.5上使用,而不能在Qt 5.2上使用。问题是这个枚举:
#includeenum Area { Area_A, Area_B, Area_C }; Q_DECLARE_METATYPE(Area)
然后,我有一个对象,它公开了这个area属性:
class MyClass : public QObject { Q_OBJECT Q_PROPERTY(Area area READ area WRITE setArea NOTIFY areaChanged) public: explicit MyClass(QObject *parent = 0) : QObject(parent), m_area(Area_A){} Area area() const { return m_area; } void setArea(Area area) { m_area = area; emit areaChanged(area); } signals: void areaChanged(Area area); private: Area m_area; };
和main.cpp:
#include#include #include #include #include "MyClass.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType ("GLib", 1, 0, "MyClass"); MyClass controller; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("controller", &controller); engine.load("./main.qml"); controller.setArea(Area_B); return app.exec(); }
它可以编译,一切正常。但是当我尝试在qml中使用area属性时:
import QtQuick 2.0 import QtQuick.Window 2.0 import GLib 1.0 Window { visible: true id: root property int area: controller.area Text { id: name text: "Test" x: area * 30 y: area * 30 } }
如果使用Qt 5.2(Linux,x64),我会遇到运行时错误:
QMetaProperty :: read:无法处理属性'MyClass :: area'的未注册数据类型'Area'file:///home/yech844/devel/test_qml/main.qml:10:24:无法将[undefined]分配给int QMetaProperty :: read:无法处理属性'MyClass :: area'的未注册数据类型'Area'file:///home/yech844/devel/test_qml/main.qml:10:24:无法将[undefined]分配给int
这是Qt中的错误吗?为什么我不能使用在类范围之外声明的Enum?
Qt 5.5引入了Q_ENUM宏,从而消除了使用Q_DECLARE_METATYPE的需要。在此处了解更多信息:https : //woboq.com/blog/q_enum.html