【问题标题】:How to load qml file from resources, using QtQuick 2 Controls如何使用 QtQuick 2 控件从资源中加载 qml 文件
【发布时间】:2015-05-10 21:54:35
【问题描述】:

我创建了 Qt Quick 2 Controls 项目,添加了资源,将我的 qml 文件放在资源中,并为该文件添加了别名。现在我想知道,为什么下一个代码无法将 qml-file 加载为主 qml-file:

#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: 组件没有准备好 错误:您的根项目必须是一个窗口。`

如何让viewer 加载我的 qml 文件?


UPD:添加了最小的工作示例——download it here

【问题讨论】:

  • 试试 qrc://main/mainQml
  • 弗兰克,这样我得到了更糟糕的结果:No file file:///path/qrc:/main/mainQml:-1 File not found

标签: qt resources qt5 qtquick2


【解决方案1】:

问题出在

void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)

它使用

setSource(QUrl::fromLocalFile(d->mainQmlFile));

用于设置源,QUrl::fromLocalFile 会弄乱路径。改成

setSource(QUrl(d->mainQmlFile));

一切正常。

更新:

在您的示例中,它实际上是 component.loadUrl(QUrl::fromLocalFile(d-&gt;mainQmlFile));,第 80 行。

【讨论】:

    【解决方案2】:

    没有文件 file:///path/qrc:/main/mainQml

    尝试更改如下代码并确保 main.qml 文件存在于资源 .qrc 文件中

    QQmlApplicationEngine engine;
        engine.rootContext()->setContextProperty("utils", &qmlUtils);
        engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
    

    如果你不使用QQmlApplicationEngine,也可以这样

     Application app(argc, argv);
     QString fileInResource("qrc:///main.qml");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-28
      • 2013-03-22
      • 1970-01-01
      • 2010-11-13
      • 2021-03-06
      • 2020-08-28
      • 1970-01-01
      相关资源
      最近更新 更多