部署Qt5 QML应用程序

fol*_*bis 11 deployment qt qml qtquick2

为了测试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();
}
Run Code Online (Sandbox Code Playgroud)

main.qml

import QtQuick 2.2
import QtQuick.Controls 1.2

ApplicationWindow {
    id: mainWindow
    title: "Test window"
    width: 800
    height: 600
    visible: true
}
Run Code Online (Sandbox Code Playgroud)

为了确保系统中没有安装任何开发库,我设置了一个纯Windows XP安装的虚拟机.然后,我按照此处所述的说明将所有 Qt5*.dll 复制到程序目录中,以及platforms/qwindows.dll和icu*52.dll.Dependency Walker确认没有遗留任何破坏的依赖关系,即一切都应该已经正确设置.

但是,由于某些原因,当我运行我的应用程序时,我什么也看不见.既不是窗口,也不是错误消息.从控制台运行也没有错误.尽管如此,我可以看到我的应用程序在任务管理器中运行,就像它在后台运行一样.在开发机器上运行应用程序没有问题:应用程序正确启动,我可以看到它的窗口.

我究竟做错了什么?如何部署QML应用程序以确保它可以在任何其他 - 非开发 - 机器上运行?

小智 7

如果您使用MinGW,请尝试将文件夹qmlplugins中的所有文件夹复制到您的程序目录中.同时复制库: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

最终目录将如下所示:

  • Enginio
  • imageformats
  • 平台
  • Qt的
  • QtGraphicalEffects
  • QtPositioning
  • QtQml
  • QtQuick
  • QtQuick.2
  • QtSensors
  • QtWebKit的
  • QtWinExtras
  • 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
  • YOUR_PROGRAM.exe

这种方式适用于未安装Qt的WindowsXP/Win7.

  • [此处](http://qt-project.org/wiki/Deploy_an_Application_on_Windows)讨论了一般过程。粗糙但有效。 (2认同)

jkj*_*uio 5

这是我到目前为止所发现的,

你不能只在main.cpp中打开一个qml文件,你必须把这些qmls放到一个资源中

qml.qrc:

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>
Run Code Online (Sandbox Code Playgroud)

然后main.cpp必须从资源加载它

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

然后构建并检查它是否有效,然后部署如下:

  • 找到EXE所在的releasse目录
  • 找到QML所在的目录
  • 在某处创建一个目录,比如说deploy

然后

cd deploy
windeployqt --release --qmldir <qml-dir-location> <exe-location>
Run Code Online (Sandbox Code Playgroud)

注意:将windeployqt的位置添加到PATH,例如.C:\ Qt的\ Qt5.5.1\5.5\msvc2013\BIN