g
gregkr23 серпня 2019 р. 11:35

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
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

7
R
  • 23 серпня 2019 р. 12:45

так а оригінальник код збираєтсья і запускає?
цей

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///layouts/layouts.qml")));
    g
    • 23 серпня 2019 р. 13:35

    Ну там-же в комментариях написано, что при значении qmlDataSource = qrc:/layouts/layouts.qml стандартный подход работает.
    Он меня не устраивает - нет результата выполнения загрузки.
    Можно конечно после загрузки делать проверку: !engine.rootObjects().isEmpty().

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

      R
      • 23 серпня 2019 р. 13:48

      чесно не розумію навіщо вам перевіряти чи завантажився базовий QML но якщо не принцепово, можна через базову сторінку грузити Loader
      і статус перевіряти, а файли передавати через пропертю

                          Loader{
                              id: loader
                              focus: true
                              asynchronous: true
                              source: ""
                              width: parent.width
                              height: parent.height
                              onStatusChanged:{
                                  if (loader.status === Loader.Ready)
                                  {
      
                                  }
                              }
                          }
      
        g
        • 23 серпня 2019 р. 14:34

        Начнем с начала: есть большой проект ( я дорабатываю и поддерживаю ), больше 100 QML-файлов с подпроектми. Сборка идет 25-30 минут. Все это работает уже несколько лет.
        При переходе на более свежую версию Qt обратил внимание, что на некоторых машинах release-версия приложения стартует, но главное окно не открывается. Путем расширенного вывода в лог вычислено место - QQmlApplicationEngine::load( "qrc:/main.qml" ), после которого engine.rootObjects() дает пустой список.
        Подчеркиваю - на некоторых машинах. Например - две копии одной виртуальной машины. Разница - на одной собирается проект, на другой - нет.
        Библиотеки везде одинаковые ( собраны windeployqt в одно место ).
        Отсюда и вырос тестовый проект из примера.
        Вопрос: откуда и почему не грузится main.qml в release-версии?
        Я не хочу обойти проблему. Я хочу ее решить.

          Evgenii Legotckoi
          • 23 серпня 2019 р. 15:55
          • (відредаговано)

          Не знаю, в чём конкретно у вас проблема на ваших машинах, но если вы запустили конкретно пример layouts и ничего не менялм в pro файле, то проблема в release версим конкретно здесь в этих строчках.

          target.path = $$[QT_INSTALL_EXAMPLES]/quick/layouts
          INSTALLS += target
          

          Стоит только их закомментировать, как в release версии ваша ошибка не проявляется.

          По сути проблема в том, что debug версия находит другие относительные пути для :/layouts/layouts.qml , в отличие от qrc:///layouts/layouts.qml .

          Возможно, что в данном конкретном случае debug версия проверяет файлы относительно каталога сборки, а release относительно места установки, в котором оказывается пусто. Вообще, если у вас всё собирается в испольняемый файл, без компиляции внешних ресурсов RCC, то обязатльно нужно использовать префикс qrc:// . Это правильно. Если же используете внешние ресурсы RCC, то нужно указывать относительный путь и чтобы этот файл там был.

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

            g
            • 24 серпня 2019 р. 02:06

            Шикарный ответ. Огромное спасибо. Буду пробовать.

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

              Evgenii Legotckoi
              • 24 серпня 2019 р. 07:21
              • (відредаговано)

              Не помню, давно уже с QML не работал, по-моему, обычно пишет в консоль, что не находит файл. В любом случае какую-то ошибку в консоль выкидывает.

              Но если честно, если у вас проект будет аккуратно разработан, а также все QML файлы будут в ресурсах, то проблемы такой возникать не должно.

                Коментарі

                Only authorized users can post comments.
                Please, Log in or Sign up
                AD

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:50бали,
                • Рейтинг балів-4
                m
                • molni99
                • 26 жовтня 2024 р. 01:37

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:80бали,
                • Рейтинг балів4
                m
                • molni99
                • 26 жовтня 2024 р. 01:29

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:20бали,
                • Рейтинг балів-10
                Останні коментарі
                ИМ
                Игорь Максимов22 листопада 2024 р. 11:51
                Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                Evgenii Legotckoi
                Evgenii Legotckoi31 жовтня 2024 р. 14:37
                Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                A
                ALO1ZE19 жовтня 2024 р. 08:19
                Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов05 жовтня 2024 р. 07:51
                Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas505 липня 2024 р. 11:02
                QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                Тепер обговоріть на форумі
                Evgenii Legotckoi
                Evgenii Legotckoi24 червня 2024 р. 15:11
                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                t
                tonypeachey115 листопада 2024 р. 06:04
                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                NSProject
                NSProject04 червня 2022 р. 03:49
                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                9
                9Anonim25 жовтня 2024 р. 09:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                Слідкуйте за нами в соціальних мережах