外部二进制资源已打开,但在QML中不存在

时间:2016-03-29 14:08:47

标签: c++ qt qml qresource

我有以下 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
    }
}

CustomObject是外部二进制资源中定义的QML文件,由rcc命令生成:

rcc -binary -o redTheme.qrc redTheme.rcc

CustomObject.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包装到QML Module中,然后将其编译为.rcc文件(表示qmldir文件在.qrc内。没有任何区别,即使我添加了CustomObject语句(import),import redTheme 1.0仍然无法识别为类型。我的 qmldir 文件的内容:

module redTheme
CustomObject 1.0 CustomObject.qml

1 个答案:

答案 0 :(得分:1)

我不是百分百肯定,但我认为QML文件只适用于"内部" QML文件,即内部资源文件中的QML文件。

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

使用外部QML文件的另一种方法是路径/ url,也就是说,如果要实例化它,则需要使用Loader或手动实例化它。

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

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

  

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

     

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