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

C++ 外部二进制资源已打开,但不存在于QML中,c++,qt,qml,qresource,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: customObje

我有以下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
    }
}
module redTheme
CustomObject 1.0 CustomObject.qml
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
,表示文件已打开

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

CustomObject不是一种类型

编辑:我已将
CustomObject
包装到
QML模块中
,然后将其编译成
.rcc
文件(这意味着
qmldir
文件在
.qrc
中)。没有任何区别,
CustomObject
仍然没有被识别为类型,即使我添加了
import
语句(
import redTheme 1.0
)。我的qmldir文件的内容:

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
    }
}
module redTheme
CustomObject 1.0 CustomObject.qml

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

为了使外部QML文件作为类型工作,您需要定义有效的QML模块及其
qmldir
文件等。也可以使用C++ API来将它公开为一种类型,但我没有研究过它,基本上,它是<代码> qMLDIr < /C>文件解析器所做的。 使用外部QML文件的另一种方法是作为路径/url,也就是说,如果您希望实例化它,您需要使用
加载程序
或手动动态实例化它

这可能有助于将外部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++代码到类型的文件,例如当需要类型映射时 在启动时按程序确定


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

QQmlApplicationEngine engine("qrc:/main.qml");

我打算创建许多主题,这些主题可以根据用户的意愿进行切换(例如:用户单击一个按钮,在蓝色主题和红色主题之间切换)。因此,我不认为使用
qmlRegisterType
是一个好主意,因为我最终会得到几十行/数百行额外的代码。我可以将我的
CustomObject
集成到
QML模块
,但它已经在
.qrc
文件中。这不是有点多余吗?好吧,要么你想用一个QML文件作为一个typr,要么你不想,这是什么?在您的代码中,这是您尝试执行的操作,注册类型是执行此操作的唯一方法,可以手动执行,也可以使用
qmldir
文件执行。至于其他方面,这实际上取决于你所说的主题是什么——只是不同的维度和颜色,还是完全不同的UI结构?目前它只是维度和颜色。我将尝试使用QML模块解决方案,并让您不断更新。请参阅更新的原始帖子。似乎不起作用。我是否应该外部化我的qmldir?@GrégoireBorel-模块在资源文件中不起作用,它需要在文件系统上,还需要在有效的导入路径中,您可以使用
void qqqmlengine::addImportPath(const QString&path)
添加导入路径。但如果只是颜色和尺寸,您可以将样式放入简单的json文件中,不需要任何花哨的东西