我有以下 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
答案 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 ++代码中的类型,例如类型映射需要时 在启动时按程序确定。