Разверните Qt5 QML-приложение

Чтобы проверить развертывание QML, я создал очень простое приложение QML. Вот код:

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QFile>

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QString path = app.applicationDirPath() + "/qml/main.qml";
    if(QFile::exists(path))
        engine.load(path);
    else {
        return 1;
    }
    return app.exec();
}

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.2

ApplicationWindow {
    id: mainWindow
    title: "Test window"
    width: 800
    height: 600
    visible: true
}

Чтобы убедиться, что в системе не установлена ​​библиотека разработки, я настроил виртуальную машину с чистой установкой Windows XP. Затем я выполнил инструкции, описанные здесь, и скопировал all Qt5 *.dll в каталог программы, а также как платформы /qwindows.dll и icu * 52.dll. Зависимость Уокер подтвердила, что не было сломанных зависимостей, т.е. Все должно быть правильно настроено.

Однако по некоторым причинам, когда я запускаю свое приложение, я ничего не вижу. Ни окно, ни сообщение об ошибке. Запуск с консоли также не дает мне никакой ошибки. Несмотря на это, я вижу, что мое приложение работает в диспетчере задач, например, работает в фоновом режиме. Запуск приложения на машине разработки идет без проблем: приложение запускается правильно, и я вижу его окна.

Что я делаю неправильно? Как я могу развернуть приложение QML, чтобы убедиться, что оно будет работать на любой другой машине без разработки?

Ответ 1

Если вы используете MinGW, попробуйте скопировать все папки из папок qml и плагинов в каталог с вашей программой. Также скопируйте библиотеки: icudt52.dll, icuin52.dll, icuuc52.dll, libgcc_s_dw2-1.dll, libstdc++-6.dll, libwinpthread-1.dll, Qt5Core.dll, Qt5Gui.dll, Qt5Network.dll, Qt5Qml.dll, Qt5Quick.dll, Qt5Svg.dll, Qt5Widgets.dll из bin

В конце концов каталог будет выглядеть так:

  • Enginio
  • imageformats
  • платформы
  • Qt
  • QtGraphicalEffects
  • QtPositioning
  • QtQml
  • QtQuick
  • QtQuick.2
  • QtSensors
  • QtWebKit
  • QtWinExtras
  • icudt52.dll
  • icuin52.dll
  • icuuc52.dll
  • libgcc_s_dw2-1.dll
  • libstdС++ - 6.dll
  • libwinpthread-1.dll
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Network.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Svg.dll
  • Qt5Widgets.dll
  • YOUR_PROGRAM.exe

Этот способ работает на WindowsXP/Win7, где Qt не был установлен.

Ответ 2

Это то, что я догадался до сих пор,

Вы не можете просто открыть qml файл в main.cpp, вы должны поместить эти qmls в ресурс

qml.qrc:

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

Затем main.cpp должен загрузить его из ресурса

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

затем выполните сборку и проверьте, работает ли она, затем разверните ее следующим образом:

  • найдите директорию release, в которой проживает ваш EXE
  • найдите каталог, в котором живет ваш QML
  • создать каталог где-нибудь, скажем, развернуть

затем

cd deploy
windeployqt --release --qmldir <qml-dir-location> <exe-location>

ПРИМЕЧАНИЕ: добавьте местоположение windeployqt в PATH например. C:\Qt\Qt5.5.1\5.5\msvc2013\BIN

Ответ 3

Вам следует использовать инструмент развертывания, который поставляется с Qt. См. Qt для Windows - развертывание, есть раздел "средство развертывания Windows".

Ответ 4

Вам необходимо развернуть приложение, для этого я использую утилиту cqtdeployer

Эта утилита сама собирает все необходимые зависимости вашего приложения, и вам не нужно тратить на это свое время, или вы можете автоматизировать этот процесс.

Вы можете установить из выпусков github (Windows)

или же

из оснастки (Linux)

sudo snap install cqtdeployer

Вы можете использовать следующим образом:

  • Окна:
%cqtdeployer% -bin myApp -qmake path/to/Qt/5.x.x/build/bin/qmake.exe -qmlDir path/to/my/qml/files/dir
  • Linux:
cqtdeployer -bin myApp -qmake path/to/Qt/5.x.x/build/bin/qmake -qmlDir path/to/my/qml/files/dir
  • path/to/Qt/5.xx/build/bin/qmake - это способ, которым qmake используется для сборки вашей программы.

  • path/to/my/qml/files/dir - это путь непосредственно к вашему qml файлу (который вы написали)

И запустить приложение с помощью скрипта sh (Linux) или exe (Windows)

Если вы будете использовать версию из оснастки, убедитесь, что у вас есть все разрешения. cqtdeployer

Если вам нужно использовать версию Windows, просто установите приложение из установщика

Ответ 5

Как упомянул BaCaRoZzo, общее решение, которое мне очень понравилось, - это следовать этому руководству.

Чтобы подвести итог, скопируйте в пустой каталог:

  • Релизная версия MyApp.exe, а также .dll, которую вы создали для этого проекта
  • Все файлы .dll из \mingw48_32\bin\
  • Все папки из \mingw48_32\plugins\
  • (Если вы использовали QML) Все папки из \mingw48_32\qml\

Во-первых, во время тестирования приложения переименуйте папку qt, чтобы она не была найдена $ PATH, и дважды щелкните MyApp.exe. Это должно запустить программу.

NB. Это приводит к очень большому приложению, поэтому вам нужно будет удалить некоторые дополнительные файлы и папки. Самый простой способ для dll: вы запускаете программу, и во время работы вы удаляете все dll в вашем новом проекте. Будут удалены только те, которые не используются MyApp.exe. Эффективное!
Для папок Qt используйте метод проб и ошибок.