如何使用QtQuick 2控件从资源加载qml文件



我创建了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");

相关内容

  • 没有找到相关文章

最新更新