运行QtQuick应用程序

时间:2017-12-05 03:56:55

标签: qt qml qt5

我在QT Creator 4.3.1中的QtQuick上创建了一个项目而没有使用ui表单。 这是代码main.qml:

    import QtQuick 2.6
    import QtQuick.Window 2.2

    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")

        MouseArea {
            anchors.fill: parent
            onClicked: {
                console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"'))
            }
        }

        TextEdit {
            id: textEdit
            text: qsTr("Enter some text...")
            verticalAlignment: Text.AlignVCenter
            anchors.top: parent.top
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.topMargin: 20
            Rectangle {
                anchors.fill: parent
                anchors.margins: -10
                color: "transparent"
                border.width: 1
            }
        }
    }

程序运行并运行。 现在我想摆脱Window并用Rectangle替换它:

import QtQuick 2.6

Rectangle {
    id: root
    width: 200; height: 200;
    color: "#ffffff"
}

但是当程序启动时,没有任何反应,表单无法打开 我做错了什么?

main.cpp代码。两种情况下的代码相同:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

1 个答案:

答案 0 :(得分:3)

在Qt应用程序中,您必须至少有一个顶级窗口,即放置其他组件的窗口。

创建项目时,应该获得默认的main.cpp:

<强>的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

<强> main.qml

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
}

让我们分析元素并使用它的文档:

  

QQmlApplicationEngine提供了一种从单个QML文件加载应用程序的便捷方式。

     

[...]

     

与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口。如果您使用Qt Quick中的可视项目,则需要将它们放在窗口中。

也就是说,QQmlApplicationEngine没有创建顶级,所以如果我们想要显示窗口,你必须使用另一个元素,并且按照建议,选项是使用Window{}

在您的第二次测试中,您正在使用某个项目,例如Rectangle,这只是一个组件,无法创建顶级,因此建议使用QQuickView

  

QQuickView类提供了一个显示Qt Quick用户界面的窗口。

     

[...]

因此,如果要显示Rectangle,则应在main.cpp中使用以下内容:

<强>的main.cpp

#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

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

    return app.exec();
}

<强> main.qml

import QtQuick 2.6

Rectangle {
    id: root
    width: 200; height: 200;
    color: "#ffffff"
}