如何将 QML 文件分配给 MainWindow/Application

Posted

技术标签:

【中文标题】如何将 QML 文件分配给 MainWindow/Application【英文标题】:How to assign QML file to MainWindow/Application 【发布时间】:2019-08-14 09:34:10 【问题描述】:

情况

我在这里有我的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>

#include "root.h"


int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);

    QQuickView view;
    testApp::Root data;

    view.rootContext()->setContextProperty("dataContext", &data);
    view.setSource(QUrl::fromLocalFile("main.qml"));
    view.show();

    return app.exec();

这里还有我的main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

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

问题

每当我启动我的应用程序时,它都不会将 main.qml 中的值分配给我的主窗口。

例如: main.qml 中的 widthheight 属性的值分别为 640480。但是每当我启动应用程序时,我的窗口就会小得多(是的,我试图给它们不同的值)

问题

程序怎么说:他应该使用 main.qml 作为我的主窗口。

【问题讨论】:

【参考方案1】:

如果您使用的是 QQuickView,那么根必须是 QQuickItem,如 Item、Rectangle 等,因为 QQuickView 是一个窗口。

如果你想根 Window 或 ApplicationWindow 那么你必须使用 QQmlApplicationEngine。

在您的情况下,有 2 个窗口:一个是 QQuickView,另一个是 Window。

考虑到上述情况,您有以下 2 个选项:

    QQuickView
int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);

    QQuickView view;
    testApp::Root data;
    view.view.setResizeMode(QQuickView::SizeRootObjectToView);

    view.rootContext()->setContextProperty("dataContext", &data);
    view.setSource(QUrl::fromLocalFile("main.qml"));
    view.setTitle("Hello World!!!")
    view.show();

    return app.exec();

import QtQuick 2.12
import QtQuick.Window 2.12

Item 
    width: 640
    height: 480

    QQmlApplicationEngine
int main(int argc, char *argv[])

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    testApp::Root data;

    engine.rootContext()->setContextProperty("dataContext", &data);
    engine.load(QUrl::fromLocalFile("main.qml"));

    return app.exec();

import QtQuick 2.12
import QtQuick.Window 2.12

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

【讨论】:

感谢您的回答,我会接受您的回答,但请您解释一下为什么 qt 无法识别 main.qml。它说“没有这样的文件或目录” @Zer0 如果您使用 QUrl::fromLocalFile() 则预期 main.qml 位于可执行文件旁边,因此如果您不想要,请将 main.qml 复制到构建文件夹中然后创建一个 qresource 并在其中添加 main.qml,然后将 QUrl::fromLocalFile("main.qml") 更改为 QUrl("qrc:/main.qml") @Zer0 通常当你使用 Qt Creator 创建项目时,它已经创建了 .qrc 并使用了 QQmlApplicationEngine,因此如果你不想遇到此类问题,则不应修改它。

以上是关于如何将 QML 文件分配给 MainWindow/Application的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Switch Qml 添加到 qt 小部件?

Qml 错误:无法将 QObject* 分配给 QQuickItem

PyQt5 + QML:带有“无法将[未定义]分配给QString”的空窗口

如何在QML中格式化QString中的Date

QML 绑定到数组元素

如何从QML基本类型列表中动态删除元素?