如何将 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 中的 width、height 属性的值分别为 640、480。但是每当我启动应用程序时,我的窗口就会小得多(是的,我试图给它们不同的值)
问题
程序怎么说:他应该使用 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的主要内容,如果未能解决你的问题,请参考以下文章
Qml 错误:无法将 QObject* 分配给 QQuickItem