我创建了Qt Quick 2 Controls项目,添加了资源,将我的qml文件放在资源中,并为此文件添加了别名。现在我想知道,为什么下一个代码不能加载qml文件作为主qml文件:
#include <QDebug>
#include <QFile>
#include <QByteArray>
#include "qtquick2controlsapplicationviewer.h"
int main(int argc, char *argv[]) {
Application app(argc, argv);
QString fileInResource(":main/mainQml");
QFile f(fileInResource);
if (!f.exists()) {
qDebug() << "No file";
} else {
f.open(QIODevice::ReadOnly);
qDebug() << f.readAll();
}
QtQuick2ControlsApplicationViewer viewer;
viewer.setMainQmlFile(fileInResource);
viewer.show();
return app.exec();
}
由于在使用QFile
的情况下,它正确读取文件并输出整个文件,但viewer
说:
file:///path/:main/mainQml:-1找不到文件
QQmlComponent:组件未准备好错误:根项目必须是Window。`
如何使viewer
加载我的qml文件?
UPD:添加了最小的工作示例--在此处下载
问题出在中
void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
它使用
setSource(QUrl::fromLocalFile(d->mainQmlFile));
并且QUrl::fromLocalFile
扰乱了路径。只需将其更改为
setSource(QUrl(d->mainQmlFile));
一切正常。
UPD:
在您的示例中,它实际上是component.loadUrl(QUrl::fromLocalFile(d->mainQmlFile));
,第80行。
无文件file:///path/qrc:/main/mainQml<-
尝试更改如下代码,并确保resource.qrc文件中存在main.qml文件
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("utils", &qmlUtils);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
如果您没有使用QQmlApplicationEngine
Application app(argc, argv);
QString fileInResource("qrc:///main.qml");