-1

我有以下main.qml文件:

import QtQuick 2.5
import QtQuick.Controls 1.4

Item
{
    anchors.centerIn: parent

    Label
    {
        id: textLabel
        anchors.fill: parent
        x: 200
        y: 400
    }

    CustomObject
    {
        id: customObjectId
    }
}

CustomObjectQML在外部二进制资源中定义的文件,由以下rcc命令生成:

rcc -binary -o redTheme.qrc redTheme.rcc

自定义对象.qml

import QtQuick 2.5
import QtQuick.Controls 1.4

Item
{
    Rectangle
    {
        width: 200
        height: 120
        color: "blue"
        Label
        {
            text: "customObject"
        }
    }
}

C++侧面,我像这样注册我的资源:

QResource::registerResource(QCoreApplication::applicationDirPath() + "/data/themes/redTheme.rcc");

函数返回true,表示文件已打开。

然而,在我的main.qml文件CustomObject中不存在。为什么?

CustomObject is not a type

编辑:我已经包装CustomObject成 aQML Module然后将其编译成一个.rcc文件(这意味着该qmldir文件在.qrc. 没有任何区别CustomObject,即使我添加了一个import语句(import redTheme 1.0),仍然不能被识别为一种类型。我的qmldir文件的内容:

module redTheme
CustomObject 1.0 CustomObject.qml
4

2 回答 2

1

我不是 100% 确定,但我认为 QML 文件作为类型仅适用于“内部”QML 文件,即内部资源文件中的 QML 文件。

为了使外部 QML 文件作为类型工作,您需要定义一个有效的 QML 模块,以及它的qmldir文件等。也可以使用 C++ API 将其公开为一种类型,但我没有研究过,基本上,qmldir文件解析器就是这样做的。

使用外部 QML 文件的另一种方式是 path/url,也就是说,如果你想实例化它,你要么需要使用 aLoader要么手动动态实例化它。

这可能有助于将外部 QML 文件注册为 QML 类型:

int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)

该函数在 QML 系统中注册一个名为 qmlName 的类型,在从 uri 导入的库中,该库具有由 versionMajor 和 versionMinor 组成的版本号。该类型由位于 url 的 QML 文件定义。url 必须是绝对 URL,即 url.isRelative() == false。

通常 QML 文件可以作为类型直接从其他 QML 文件加载,或者使用 qmldir 文件。此函数允许将文件注册到 C++ 代码中的类型,例如当类型映射需要在启动时以程序方式确定时。

于 2016-03-29T14:14:42.037 回答
0

我遇到了与外部 rcc 文件类似的效果。从外部资源加载 qml 文件时,尝试将 'qrc' 方案添加到您的 url:

QQmlApplicationEngine engine("qrc:/main.qml");
于 2020-01-04T07:05:45.727 回答