簡體   English   中英

QML:使用自定義QObject鍵入Error

[英]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”

所以, myDatanull 我們可以使用另一種基於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 ++引用此屬性。 但是,您可以通過兩種方式實現此目的:

  1. 聲明項目的屬性別名
  2. 給它一個objectName並使用QObject :: findChild來查找它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM