Внешний бинарный ресурс открыт, но не существует в 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");
Другие вопросы по тегам