Внешний бинарный ресурс открыт, но не существует в QML
У меня есть следующий файл 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
, что означает, что файл открыт.
Еще, CustomObject
не существует в моем файле main.qml. Зачем?
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 ответ
Я не уверен на 100%, но я думаю, что файлы QML как типы работают только для "внутренних" файлов QML, то есть файлов QML, которые находятся во внутреннем файле ресурсов.
Чтобы внешние файлы QML работали как типы, вам нужно определить действительный модуль QML с его qmldir
файл и тому подобное. Также возможно представить его как тип с использованием API C++, но я не исследовал его, в основном, это то, что qmldir
анализатор файлов делает.
Другой способ использования внешних файлов QML - это путь / URL, то есть, если вы хотите, чтобы он был создан, вам нужно либо использовать Loader
или вручную создать его динамически.
Это может помочь зарегистрировать внешние файлы QML как типы QML:
int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
Эта функция регистрирует тип в системе QML с именем qmlName, в библиотеке, импортированной из uri, с номером версии, составленным из versionMajor и versionMinor. Тип определяется файлом QML, расположенным по адресу url. URL-адрес должен быть абсолютным URL, т.е. url.isRelative() == false.
Обычно файлы QML можно загружать как типы непосредственно из других файлов QML или с помощью файла qmldir. Эта функция позволяет регистрировать файлы по типам из кода C++, например, когда требуется, чтобы отображение типов было процедурно определено при запуске.
Я столкнулся с аналогичным эффектом с внешними rcc файлами. Попробуйте добавить схему qrc к своему URL-адресу при загрузке файлов qml из внешних ресурсов:
QQmlApplicationEngine engine("qrc:/main.qml");