部署Qt5 QML应用程序

时间:2014-07-31 00:27:44

标签: qt deployment 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();
}

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安装的虚拟机。然后,我按照here所述的说明操作,并将所有 Qt5 * .dll复制到程序目录中,以及platforms / qwindows.dll和icu * 52.dll。 Dependency Walker确认没有遗留任何破坏的依赖关系,即一切都应该已经正确设置。

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

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

6 个答案:

答案 0 :(得分:8)

如果您使用MinGW,请尝试将文件夹 qml 插件中的所有文件夹复制到您的程序目录中。同时复制库:icudt52.dllicuin52.dllicuuc52.dlllibgcc_s_dw2-1.dlllibstdc++-6.dlllibwinpthread-1.dllQt5Core.dll,{{1}来自 bin

的{},Qt5Gui.dllQt5Network.dllQt5Qml.dllQt5Quick.dllQt5Svg.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。

答案 1 :(得分:5)

这是我到目前为止所知道的,

您无法在main.cpp中打开qml文件,您必须将这些qmls放入资源

qml.qrc:

private var KTableHeaderHeight: CGFloat

然后main.cpp必须从资源

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

然后构建并检查它是否有效,然后按如下方式进行部署:

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

然后

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

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

答案 2 :(得分:2)

您应该使用Qt附带的部署工具。请参阅Qt for Windows - Deployment,其中有一节&#34; Windows部署工具&#34;。

答案 3 :(得分:1)

BaCaRoZzo所述,对我来说效果很好的一般解决方案是遵循此guide

总结起来,复制到一个空目录中:

  • MyApp.exe的发行版本,以及为该项目创建的.dll以及
  • \ mingw48_32 \ bin \
  • 中的所有.dll文件
  • \ mingw48_32 \ plugins \
  • 中的所有文件夹
  • (如果使用的是QML)\ mingw48_32 \ qml \
  • 中的所有文件夹

首先,在应用程序测试期间,重命名qt文件夹,以便$ PATH找不到该文件夹​​,然后双击MyApp.exe。这应该运行该程序。

NB:这会导致一个非常大的应用程序,因此您将需要删除一些额外的文件和文件夹。 对于dll,最简单的方法是:运行程序,然后在运行时删除新项目中的所有dll。只有未被MyApp.exe使用的文件才会被删除。高效!
对于Qt文件夹,请反复尝试。

答案 4 :(得分:0)

您需要部署应用程序,为此,我使用该实用程序 cqtdeployer

该实用程序本身会收集应用程序的所有必需依赖关系,您不必花时间在它上面,也可以自动化此过程。

您可以从github版开始安装(Windows)

来自snapstore(Linux)

sudo snap install cqtdeployer

您可以使用以下方式:

  • Windows:
%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.x.x / build / bin / qmake-这是qmake用来构建程序的方式。

  • path / to / my / qml / files / dir-这是直接到您的qml文件(您编写)的路径

然后使用sh脚本(Linux)或exe(Windows)运行应用程序

如果要使用snap的版本,请确保拥有所有权限。 cqtdeployer

如果您需要使用Windows版本,只需从installer安装应用程序

答案 5 :(得分:0)

使用 windeployqt --qmldir f:\myApp\sources f:\build-myApp\myApp.exe 命令。 qmldir 之后的第一个参数是您的 qml 文件夹位置,第二个参数是您的 exe 所在的位置。您将在任何环境中获得可部署的 exe。