当前位置:  开发笔记 > 编程语言 > 正文

Qt属性中的枚举

如何解决《Qt属性中的枚举》经验,为你挑选了1个好方法。

我有一个代码,它可以在Qt 5.5上使用,而不能在Qt 5.2上使用。问题是这个枚举

#include 
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 
#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?



1> 小智..:

Qt 5.5引入了Q_ENUM宏,从而消除了使用Q_DECLARE_METATYPE的需要。在此处了解更多信息:https : //woboq.com/blog/q_enum.html

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有