4

鉴于我在下面的想法,我是在吠叫错误的树吗?或者提供以下信息我是否滥用 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 加载组件失败 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
4

1 回答 1

6

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

主屏幕.h

Q_PROPERTY(qreal deltaT READ getDeltaT WRITE setDeltaT NOTIFY deltaTChanged)

main.qml

MainScreen {
    SequentialAnimation on deltaT {

    }
}
于 2015-02-28T06:25:31.023 回答