c++ - Qt 属性中的枚举

标签 c++ qt qmetaobject

我有一个代码,它适用于 Qt 5.5 而不适用于 Qt 5.2。这个枚举有问题:

#include <QtCore/QMetaType>
enum 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 <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/QQmlContext>
#include <QtQml/QtQml>
#include "MyClass.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<MyClass>("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: Unable to handle unregistered datatype 'Area' for property 'MyClass::area' file:///home/yech844/devel/test_qml/main.qml:10:24: Unable to assign [undefined] to int QMetaProperty::read: Unable to handle unregistered datatype 'Area' for property 'MyClass::area' file:///home/yech844/devel/test_qml/main.qml:10:24: Unable to assign [undefined] to int

这是 Qt 中的错误吗?为什么我不能使用在类范围之外声明的枚举?

最佳答案

Qt 5.5 引入了 Q_ENUM 宏,不再需要使用 Q_DECLARE_METATYPE。在这里阅读更多相关信息:https://woboq.com/blog/q_enum.html

关于c++ - Qt 属性中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070913/

相关文章:

c++ - 使用 Qt 5.4 添加 iOS 应用程序的设置条目

c++ - 无法在 CMake 项目中使用 Q_OBJECT 宏

c++ - Xcode 和 Clang 神秘地包含了我没有指定的 header

c++ - 如何在 C++ 中使用 C 代码

c++ - SSE1 使用 divps intrinsic xmmintrin.h 划分四个 32 位 float 并使用 printf?

c++ - QToolBar 扩展按钮

c++ - 如何始终编译文件?

c++ - 可变字符串比较

Qt - 派生类是否继承其基类的元属性?

c++ - 如何去序列化一个大型的,复杂的对象?