LINUX.ORG.RU

Использование файлов ресурсов динамической библиотеки

 , ,


0

1

Есть такая проблемка. У меня есть библиотеки с единым интерфейсом, которые реализуют метод, возвращающий QQmlComponent*. Сам QQmlComponent создается на основе qml файла, описанного в фале ресурсов qrc. В каждой библиотеки он свой. Примерно так возвращается объект:

QQmlComponent *component = new QQmlComponent (engine, QUrl("qrc:/qml/resource/qml/start.qml"), rootObject);
return component;
В основном коде, который использует библиотеки используется просто для создания компонента:
...
auto item = qobject_cast<QQuickItem*>(plugincomponent->create());
...
Проблема возникает, при вызове для item метода setParentItem. Собственно в вывод сваливается «QQmlComponent: Component is not ready».
При загрузке не из фала ресурсов, а из локального, работает нормально.
QQmlComponent *component = new QQmlComponent (engine,
    QUrl::fromLocalFile(QString("%1/resource/qml/start.qml").arg(projectdir)), 
    rootObject);
return component;

У вызывающего кода тоже есть свой файл ресурсов. Падает всё на этапе выполнения. Используется Qt5.5.1.
Как лучше решить эту проблему, чтобы не таскать лишние файлы вслед за библиотеками?


http://doc.qt.io/qt-5/qqmlcomponent.html#CompilationMode-enum

В общем случае всегда нужно ожидать, что компонент будет грузиться асинхронно.

Ещё непонятно зачем нужен свой тип плагина, для компонентов уже есть QQmlExtensionPlugin, который работает в том числе и с ресурсами. А если нет кода на C++, то можно просто через qmldir.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

В общем случае всегда нужно ожидать, что компонент будет грузиться асинхронно.

Нет, для схем file:/ и qrc:/ режим должен быть синхронным, как и для assets:/ на андроиде. См. метод bool QQmlFile::isSynchronous(const QUrl &url)

fluorite ★★★★★
()

Ну и статус проверяй перед create(). Должен быть Ready. http://doc.qt.io/qt-5/qqmlcomponent.html#Status-enum

Спасибо, что-то не подумал про должные проверки. Тем не менее сегодня заработало всё само собой. Так и не понял, что это было😳

SvSon
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.