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 г. 2:06

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

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

              Evgenii Legotckoi
              • 24 августа 2019 г. 7:21
              • (ред.)

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

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

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                AD

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

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

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

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

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

                • Результат:20баллов,
                • Очки рейтинга-10
                Последние комментарии
                i
                innorwall14 ноября 2024 г. 21:26
                Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
                i
                innorwall14 ноября 2024 г. 19:03
                Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                i
                innorwall14 ноября 2024 г. 11:42
                Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                i
                innorwall14 ноября 2024 г. 9:09
                Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                Сейчас обсуждают на форуме
                i
                innorwall14 ноября 2024 г. 3:39
                добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                i
                innorwall11 ноября 2024 г. 10:55
                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                9
                9Anonim25 октября 2024 г. 9:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                ИМ
                Игорь Максимов3 октября 2024 г. 4:05
                Реализация навигации по разделам Спасибо Евгений!

                Следите за нами в социальных сетях