QtQuick: QQmlApplicationEngine не удалось загрузить компонент qrc:/main.qml:23 Неверное присвоение прикрепленного объекта

Учитывая мои мысли ниже, я лаю не на том дереве? Или, предоставив информацию ниже, я неправильно использую Qt API, чтобы получить ошибку в заголовке?

Я пытаюсь изменить образец по адресу http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html для работы с проектом QtQuick по умолчанию, созданным с помощью Qt Creator 3.3.0 (opensource) на основе 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")));

Я не уверен, что разница в использовании QQmlApplicationEngine поверх QuickView может быть причиной моей ошибки:

QQmlApplicationEngine не удалось загрузить компонент qrc:/main.qml:23
Неверное присвоение прикрепленного объекта

Где мой 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

1 ответ

Решение

Имя свойства должно начинаться со строчной буквы. Вам нужно изменить DeltaT на deltaT.

MainScreen.h

Q_PROPERTY(qreal deltaT READ getDeltaT WRITE setDeltaT NOTIFY deltaTChanged)

main.qml

MainScreen {
    SequentialAnimation on deltaT {

    }
}
Другие вопросы по тегам