QtQuick:QQmlApplicationEngine 无法加载组件 qrc:/main.qml:23 附加的 object 分配无效

QtQuick: QQmlApplicationEngine failed to load component qrc:/main.qml:23 Invalid attached object assignment

鉴于我下面的想法,我是不是找错了树?或者提供以下信息,我是否滥用 Qt API 来获取标题中的错误?

我正在尝试修改 http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html 中的示例,以使用使用 Qt Creator 3.3.0(开源)生成的默认 QtQuick 项目 基于 Qt 5.4.0(GCC 4.6.1,64 位)。

看完代码后,我印象最深刻的是:

样本main.cpp使用:

qmlRegisterType<Squircle>("OpenGLUnderQML", 1, 0, "Squircle");

QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/openglunderqml/main.qml"));
view.show();

通过一些重命名,我的 main.cpp 使用

qmlRegisterType<MainScreen>("OpenGLUnderQML", 1, 0, "MainScreen");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

我不确定在 QuickView 上使用 QQmlApplicationEngine 的不同是否会导致我的错误:

QQmlApplicationEngine failed to load component qrc:/main.qml:23
Invalid attached object assignment

我的 main.qml 看起来像:

import QtQuick 2.4
import QtQuick.Window 2.2
import OpenGLUnderQML 1.0
import "qmlmodel"

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true
    color: "black"
    title: "Army Calculator"
    objectName: "mainWindow"

    ListView {
        id: mainListView
        anchors.fill: parent
        objectName: "mainListView"
    }

    MainScreen {
        SequentialAnimation on DeltaT {
            NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad }
            NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad }
            loops: Animation.Infinite
            running: true
        }
    }
}

样本使用:

import QtQuick 2.0
import OpenGLUnderQML 1.0

Item {

    width: 320
    height: 480

    Squircle {
        SequentialAnimation on t {
            NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad }
            NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad }
            loops: Animation.Infinite
            running: true
        }
    }
    Rectangle {
        color: Qt.rgba(1, 1, 1, 0.7)
        radius: 10
        border.width: 1
        border.color: "white"
        anchors.fill: label
        anchors.margins: -10
    }

    Text {
        id: label
        color: "black"
        wrapMode: Text.WordWrap
        text: "The background here is a squircle rendered with raw OpenGL using the 'beforeRender()' signal in QQuickWindow. This text label and its border is rendered using QML"
        anchors.right: parent.right
        anchors.left: parent.left
        anchors.bottom: parent.bottom
        anchors.margins: 20
    }
}

根据下面评论中的要求 MainScreen.h 是

#ifndef MAINSCREEN_H
#define MAINSCREEN_H

#include <QQuickItem>

class MainScreenRenderer;
class QQuickWindow;

class MainScreen : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(qreal DeltaT READ getDeltaT WRITE setDeltaT NOTIFY deltaTChanged)

public:
    MainScreen();
    ~MainScreen();

    qreal getDeltaT() const;
    void setDeltaT(qreal deltaT);

signals:
    void deltaTChanged();

public slots:
    void sync();
    void cleanup();

private slots:
    void handleWindowChanged(QQuickWindow *win);

private:
    qreal m_DeltaT;
    MainScreenRenderer *m_Renderer;
};


#endif // MAINSCREEN_H

属性 名称应以小写字母开头。您需要将 DeltaT 更改为 deltaT。

MainScreen.h

Q_PROPERTY(qreal deltaT READ getDeltaT WRITE setDeltaT NOTIFY deltaTChanged)

main.qml

MainScreen {
    SequentialAnimation on deltaT {

    }
}