LINUX.ORG.RU

Qt/QML деплой, qml файлы или убрать или засунуть в ресурсы

 ,


0

2

В документации написано, что с версии Qt 5.2 достаточно положить плагин quick controls и qmldir файл в подкаталог каталога где лежит бинарник приложения. Но если так сделать то будут ошибки на отсутствие стандартных (тех которые из исходников Qt) qml файлов типа Label.qml. Если добавить отсутствующие *.qml файлы из исходников Qt то всё работает.

Вопрос, документация врёт, что *.qml не нужны и что они якобы уже находятся в ресурсах скомпилированного плагина QuickControls? Обязательно ли таскать *.qml файлы из исходников Qt вместе со своим приложением? Нельзя ли *.qml файлы из исходников Qt засунуть в ресурсы своего приложения? Я пробовал добавить в ресурсы, но это не сработало.



Последнее исправление: Golanger (всего исправлений: 2)

Попробуй воспользоваться утилитами macdeployqt, linuxdeployqt (сторонний проект), windeployqt, как пишет об этом официальная документация.

Я не занимался деплоем QtQuick-приложений, но точно могу сказать что бандлить системные QML-файлы не нужно и ты что-то делаешь не так.

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

Ну-ка покажи место в документации, где такое написано.

Since Qt 5.2, the Qt Quick Controls JavaScript and QML files are embedded into the plugin using Qt resources (.qrc) for the QtQuick.Controls and QtQuick.Controls.Styles imports. It is only necessary to deploy the qtquickcontrolsplugin C++ library and its qmldir file found in the plugin directory qml/QtQuick/Controls.

https://doc.qt.io/qt-5/qtquickcontrols-overview.html#deploying-qt-quick-controls

Golanger
() автор топика
Ответ на: комментарий от fluorite

Уважаемый, включите мозг, там сказано что - «It is only necessary to deploy the qtquickcontrolsplugin C++ library and its qmldir». Практика показывает, что этого не достаточно нужно ещё рядом положить qml файлы из qml/QtQuick/Controls.

Golanger
() автор топика
Ответ на: комментарий от Golanger

Ну правильно, по твоей же ссылке написано, для чего:

The .js/.qml files are still placed into the plugin directory though for keeping the development tasks convenient, debugging and autocompletion capabilities remain unchanged. For deployment, these files can be ignored. In practice, the Styles and Private subfolders can be deleted as well as all .js and .qml files present under qml/QtQuick/Controls.

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

Это вы реально не понимаете или прикалываетесь? Объясняю ещё раз, положить только библиотеку плагина и qmldir файл не достаточно, нужно ещё рядом положить qml файлы из qml/QtQuick/Controls. Вы сами процитировали кусок где сказано, что в исходниках Qt эти файлы не для деплоя.

Golanger
() автор топика
Ответ на: комментарий от fluorite

Деплой — это не положить в каталог рядом с бинарником. Ладно, подскажу: http://doc.qt.io/qt-5/qt-conf.html

Итого, без *.qml файлов из исходников Qt никак не обойтись? Они не встраиваются в ресурсы плагина?

Golanger
() автор топика
Ответ на: комментарий от fluorite

100% уверен, что оно подхватывается поскольку у меня больше нигде нету этой библиотеки. Я ставлю на чистую виртуалку посредством инсталлятора в который добавлен плагин QuickControls, qmldir и опционально qml файлы из qml/QtQuick/Controls. Когда делаю инталлятор с qml файлами всё работает когда делаю без ругается на отсутствие того же Label.qml и т.п. из QuickControls.

Golanger
() автор топика
Ответ на: комментарий от Golanger

Это плагин QuickControls требует qml файлы, если бы он не подхватывался не было бы ошибок об отсутствии qml файлов

Golanger
() автор топика
Ответ на: комментарий от Golanger

Смотри, в коде плагина реализован поиск qml внутри qrc. Теперь идём и смотрим в бинарь:

$ strings /usr/lib64/qt5/qml/QtQuick/Controls/libqtquickcontrolsplugin.so | grep qrc
qrc:/QtQuick/Controls
qrc:/ 

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

Я смотрел исходники, да там вроде как есть работа с ресурсами, но сам файл типа resources.qrc отсутствует. Получается, что раз такая возможность в коде, как бы и есть но ничего из qml файлов в ресурсы не добавляется.

Golanger
() автор топика
Ответ на: комментарий от fluorite

Вставь в main после всех инициализаций и посмотри, что у тебя в ресурсах

QDirIterator it(":/", QDirIterator::Subdirectories);
while (it.hasNext()) {
    qDebug() << it.next();
}

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

Плохо смотрел

Это pro файл т.е. файл проекта, а не файл ресурсов и там qml не добавляются в ресурсы, а добавляются в кеш. И для меня это не подходит поскольку для моей версии Qt 5.9.6 с cmake это не реализовано.

Golanger
() автор топика
Ответ на: комментарий от fluorite

Добавь там

engine.addImportPath(QStringLiteral(":/"));
//или, я точно не помню, как именно
engine.addImportPath(QStringLiteral("qrc:/"));
и попробуй ещё раз вывести.

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

80-я строчка — это именно создание файла ресурсов.

80-ую строчку не заметил. Предположим они добавлены в ресурсы плагина, почему они тогда не используются из ресурсов, а требуется радом с плагином положить qml файлы?

Какой кеш, что ты несёшь?

Я привел тебе ссылку на то, что такое кеш и на строчке 47 включается кеш qml.

Так. Т.е. у тебя микс из qrc и локальных файлов?

У меня вместо pro файлов cmake файлы. Всё остальное тоже самое, что и обычно. Моя задача сделать так, чтобы приложение можно было поставить на машине где нет Qt и чтобы оно работало и чтобы если можно не таскать qml файлы не таскать их т.к. они много весят.

Golanger
() автор топика
Ответ на: комментарий от Golanger

Ну вот мы подошли к тому, что плагин с контролами не загружен. Давай проверять

QPluginLoader pl("/path/to/libqtquickcontrolsplugin"); qDebug() << pl.isLoaded(); 

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

Без понятия, я в винде плохо разбираюсь.

Golanger
() автор топика
Ответ на: комментарий от Golanger

Моя задача сделать так, чтобы приложение можно было поставить на машине где нет Qt и чтобы оно работало и чтобы если можно не таскать qml файлы не таскать их т.к. они много весят.

Статическая сборка «всё своё ношу с собой» аля в один EXE-файл не рассматривается?

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

Нет. Оно сделано на плагинах, владелец на статику переводить не будет.

Golanger
() автор топика
Ответ на: комментарий от fluorite

Ну вот мы подошли к тому, что плагин с контролами не загружен

Плагин не был загружен, я его загрузил и вот что получилось вытащить из ресурсов:

:/QtQuick/Controls :/QtQuick/Controls/Shaders :/QtQuick/Controls/Shaders/+hlsl :/QtQuick/Controls/Shaders/+hlsl/glow.frag :/QtQuick/Controls/Shaders/+hlsl/blur.frag :/QtQuick/Controls/Shaders/+hlsl/blur.vert :/QtQuick/Controls/Shaders/+glslcore :/QtQuick/Controls/Shaders/+glslcore/glow.frag :/QtQuick/Controls/Shaders/+glslcore/blur.frag :/QtQuick/Controls/Shaders/+glslcore/blur.vert :/QtQuick/Controls/Shaders/glow.frag :/QtQuick/Controls/Shaders/blur.frag

никаких qml файлов в ресурсах нет. Если посмотреть pro файл то видно, что qml файлы будут добавлены в ресурсы если есть или qtquickcompiler или нету qmlcache. Оба условия не выполняются потому qml не добавлются в ресурсы. В моей версии Qt 5.9 ещё нету qtquickcompiler, он есть только в коммерческой версии, а qmlcache работает нормально.

Спасибо fluorite за помощь, вопрос решён

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