C++ 外部二进制资源已打开,但不存在于QML中
我有以下main.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
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文件中,不需要任何花哨的东西