QQmlApplicationEngine::loadData() в Release сборке
QQmlApplicationEngine, release
Возникла проблема с запуском QML-приложения (Qt 5.12.2( mingw 7.3 32-bit )/ Windows-8 64-bit).
Создал приложение из примера Qt\Examples\Qt-5.12.2\quick\layouts\ :
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QDir> #include <QFile> #include <QResource> #include <QByteArray> #include <iostream> void exploreQrcDir( const QString& path ) { QDir qrcDir( ":/layouts" ); std::cout << ":/layouts : " << std::endl; for ( const QString& item : qrcDir.entryList()) { std::cout << item.toStdString() << std::endl; } for ( const QFileInfo& item : qrcDir.entryInfoList()) { std::cout << item.absoluteFilePath().toStdString() << ";" << item.isReadable() << std::endl; } } QByteArray resourceData( const QString& path ) { QResource qmlFile( path ); std::cout << "Resource is valid = " << qmlFile.isValid() << " , is compressed = " << qmlFile.isCompressed() << " , size = " << qmlFile.size() << std::endl; QByteArray data = (const char*)( qmlFile.data() ); std::cout << "Resource data = " << qmlFile.data() << std::endl; std::cout << "ByteArray = " << data.toStdString() << std::endl; return data; } int main(int argc, char* argv[]) { QGuiApplication app(argc, argv); exploreQrcDir( ":/layouts" ); const QString qmlDataSource( "qrc:/layouts/layouts.qml" ); QQmlApplicationEngine engine; engine.loadData( resourceData( ":/layouts/layouts.qml" ) ); // debug version - ok // release version - qml window not open // engine.load( qmlDataSource ); // ok // engine.load( QUrl( qmlDataSource ) ); // ok return app.exec(); }
В результате в debug-версии работает любой вариант.
А в release-версии - приложение виснет на engine.loadData().
Ни сообщений об ошибке, ни окна приложения, ничего. Только процесс висит.
Вопрос: как гарантированно загрузить qml-файл из ресурсов приложения?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
AD
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
m
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
m
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Останні коментарі
ИМ
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 листопада 2024 р. 11:51
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов05 жовтня 2024 р. 07:51
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi24 червня 2024 р. 15:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 листопада 2024 р. 06:04
NSProject04 червня 2022 р. 03:49
IscanderChe31 жовтня 2024 р. 15:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
так а оригінальник код збираєтсья і запускає?
цей
Ну там-же в комментариях написано, что при значении qmlDataSource = qrc:/layouts/layouts.qml стандартный подход работает.
Он меня не устраивает - нет результата выполнения загрузки.
Можно конечно после загрузки делать проверку: !engine.rootObjects().isEmpty().
Собственно вопрос с загрузкой QML-файла из ресурса возник в другом проекте, а этот я взял чтобы найти алтернативный вариант.
И получил неожиданность.
чесно не розумію навіщо вам перевіряти чи завантажився базовий QML но якщо не принцепово, можна через базову сторінку грузити Loader
і статус перевіряти, а файли передавати через пропертю
Начнем с начала: есть большой проект ( я дорабатываю и поддерживаю ), больше 100 QML-файлов с подпроектми. Сборка идет 25-30 минут. Все это работает уже несколько лет.
При переходе на более свежую версию Qt обратил внимание, что на некоторых машинах release-версия приложения стартует, но главное окно не открывается. Путем расширенного вывода в лог вычислено место - QQmlApplicationEngine::load( "qrc:/main.qml" ), после которого engine.rootObjects() дает пустой список.
Подчеркиваю - на некоторых машинах. Например - две копии одной виртуальной машины. Разница - на одной собирается проект, на другой - нет.
Библиотеки везде одинаковые ( собраны windeployqt в одно место ).
Отсюда и вырос тестовый проект из примера.
Вопрос: откуда и почему не грузится main.qml в release-версии?
Я не хочу обойти проблему. Я хочу ее решить.
Не знаю, в чём конкретно у вас проблема на ваших машинах, но если вы запустили конкретно пример layouts и ничего не менялм в pro файле, то проблема в release версим конкретно здесь в этих строчках.
Стоит только их закомментировать, как в release версии ваша ошибка не проявляется.
По сути проблема в том, что debug версия находит другие относительные пути для :/layouts/layouts.qml , в отличие от qrc:///layouts/layouts.qml .
Возможно, что в данном конкретном случае debug версия проверяет файлы относительно каталога сборки, а release относительно места установки, в котором оказывается пусто. Вообще, если у вас всё собирается в испольняемый файл, без компиляции внешних ресурсов RCC, то обязатльно нужно использовать префикс qrc:// . Это правильно. Если же используете внешние ресурсы RCC, то нужно указывать относительный путь и чтобы этот файл там был.
По сути, непонятно по какой причине, у вас на некоторых машинах не находится правильно путь к ресурсам. Можете попробовать собирать в RCC и класть рядом с исполняемым файлом, и соответсвенно указывать путь к RCC относительно исполняемого файла. Это должно гарантированно решить вашу проблему. Если останутся нерабочие машины, то тогда писать на багтрекер Qt.
Шикарный ответ. Огромное спасибо. Буду пробовать.
Дополнительный вопрос ( возникла мысль, но не проверял ) - что будет с загузкой qml-файла, если он ссылается на недоступный qml-файл?
Приложение будет бросать какие-то сообщения или будет молча не загрузиться?
Не помню, давно уже с QML не работал, по-моему, обычно пишет в консоль, что не находит файл. В любом случае какую-то ошибку в консоль выкидывает.
Но если честно, если у вас проект будет аккуратно разработан, а также все QML файлы будут в ресурсах, то проблемы такой возникать не должно.