Qt 5.5で動作し、 Qt 5.2では動作しないコードがあります。問題はこの列挙型にあります:
#include <QtCore/QMetaType>
enum Area
{
Area_A,
Area_B,
Area_C
};
Q_DECLARE_METATYPE(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: プロパティ 'MyClass::area' の未登録のデータ型 'Area' を処理できませんQMetaProperty::read: プロパティ 'MyClass::area' の未登録のデータ型 'Area' を処理できません
Qtのバグですか?Class スコープ外で宣言されている Enum を使用できないのはなぜですか?