У меня есть следующее 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
Я не уверен на 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, имеющей номер версии
составлено из версии Мажор и версии Минор. Тип определяется
файл QML, расположенный по адресу URL-адрес должен быть абсолютным URL, т.е.
url.isRelative () == false.Обычно файлы QML могут быть загружены как типы непосредственно из другого QML
файлы или используя файл qmldir. Эта функция позволяет регистрировать
файлы для типов из кода C ++, например, когда необходимо сопоставление типов
быть процедурно определенным при запуске.
Других решений пока нет …