[英]QML: Type Error with custom QObject
我正在嘗試使用QML來嘗試使其更容易合並兩者更加無縫; 確切地說,我正在嘗試將具有結構化數據的對象鏈接到QML。
我有以下設置:
main.cpp中:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "dataobject.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qmlRegisterType<DataObject>("DO", 1,0,"DataObject");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
dataobject.h:
#ifndef DATAOBJECT_H
#define DATAOBJECT_H
#include <QObject>
#include <QVariant>
#include <iostream>
class DataObject : public QObject
{
Q_OBJECT
Q_PROPERTY(qreal a MEMBER a NOTIFY aChanged)
Q_PROPERTY(qreal b MEMBER b NOTIFY bChanged)
public:
explicit DataObject(QObject *parent = 0);
signals:
void aChanged();
void bChanged();
public slots:
void printState() {
using namespace std;
cout << a << ", " << b << endl;
}
private:
qreal a;
qreal b;
};
#endif // DATAOBJECT_H
dataobject.cpp:
#include "dataobject.h"
DataObject::DataObject(QObject *parent) :
QObject(parent)
{
connect(this, SIGNAL(aChanged()), this, SLOT(printState()));
connect(this, SIGNAL(bChanged()), this, SLOT(printState()));
}
main.qml:
import DO 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
Text {
text: qsTr("Hello World")
MouseArea {
property DataObject myData;
anchors.fill: parent
drag.target: parent
onReleased: {
myData.a = mouse.x;
myData.b = mouse.y;
}
}
}
}
qml.qrc:
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>
現在,我希望QML生成的值可以直接輸入C ++中的對象(即MouseArea中的onReleased處理程序試圖寫入myData字段)。 但是,這個基本的概念證明不起作用,但我真的不明白為什么。
我得到的錯誤(拖動和釋放鼠標按鈕)是:qrc:///main.qml:29:TypeError:類型錯誤
這與“myData.a = mouse.x;”行匹配,因此它會立即失敗。
我知道哪里出錯了? 我嘗試過使用int,double,QVariant和qreal等字段,其中沒有一個有效。 在QML中基本無法鏈接這樣的對象嗎? 如果是這樣,任何想法,例如,如何在Qt源代碼中實現anchors.fill?
如果您分解錯誤來自的行上的表達式,它會有所幫助。 首先嘗試打印myData.a
:
print(myData.a)
myData.a = mouse.x;
myData.b = mouse.y;
qrc:///main.qml:31:TypeError:無法讀取null的屬性“a”
所以, myData
為null
。 我們可以使用另一種基於QObject
的類型來驗證這一點:
MouseArea {
property DataObject myData;
property Item item
anchors.fill: parent
drag.target: parent
onReleased: {
print(item)
myData.a = mouse.x;
myData.b = mouse.y;
}
}
qml:null
因此,您可以通過初始化屬性來修復此錯誤:
property DataObject myData: DataObject {}
您可以將基於QObject的屬性視為JavaScript的指針; 它們可以為null
或指向有效對象...或undefined
。 :)我在這里找不到任何關於此的內容,但這就是應該提到這種行為的地方。
如果你想簡化一些事情,你可以通過使它成為MouseArea
的子對象而不是屬性來為你構造默認構造的對象:
MouseArea {
DataObject {
id: myData
}
anchors.fill: parent
drag.target: parent
onReleased: {
myData.a = mouse.x;
myData.b = mouse.y;
}
}
目前,您將無法從C ++引用此屬性。 但是,您可以通過兩種方式實現此目的:
objectName
並使用QObject :: findChild來查找它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.