部署Qt5 QML应用程序

14

为了测试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();
}

主界面.qml

import QtQuick 2.2
import QtQuick.Controls 1.2

ApplicationWindow {
    id: mainWindow
    title: "Test window"
    width: 800
    height: 600
    visible: true
}
为了确保系统中没有安装开发库,我创建了一个虚拟机并安装了纯净的Windows XP。然后,我按照这里描述的说明操作,并将所有 Qt5 * .dll文件复制到程序目录中,以及 platforms/qwindows.dll 和icu * 52.dll。依赖项检查器确认没有留下错误的依赖项,即一切都应该已正确设置。
但是,由于某些原因,当我运行我的应用程序时,我什么也看不到,既没有窗口,也没有错误消息。从控制台运行也没有错误。尽管如此,我可以在任务管理器中看到我的应用程序正在运行,就像它在后台运行一样。在开发计算机上运行应用程序没有问题:应用程序正确启动,我可以看到它的窗口。
我做错了什么?如何部署QML应用程序以确保它可以在任何其他非开发计算机上运行?

2
在项目文件中使用 CONFIG += console 来构建您的应用程序,以便在控制台中获取错误。此外请注意,QtQuick2 应用程序可能无法在 VirtualBox 中正常工作,因为它存在 OpenGL 问题。 - nib
使用以下命令行:windeployqt --qmldir f:\myApp\sources f:\build-myApp\myApp.exe,进行Qt应用程序的部署。 - Harshad Karemore
8个回答

7
如果您使用MinGW,请尝试将 qml plugins 文件夹中的所有文件复制到包含您的程序的目录中。还需从bin文件夹复制以下库文件: 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 platforms 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系统。

2
一般的步骤在这里讨论:http://qt-project.org/wiki/Deploy_an_Application_on_Windows。粗略但有效。 - BaCaRoZzo

6

目前我已经弄清楚的是,

你不能只在main.cpp中打开qml文件,而必须将这些qml文件放入资源中。

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();
}

首先构建并检查它是否工作,然后按以下方式部署:

  • 找到您的EXE所在的发布目录
  • 找到您的QML所在的目录
  • 创建一个目录,例如deploy

然后

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

注意:将windeployqt的路径添加到PATH中,例如:C:\Qt\Qt5.5.1\5.5\msvc2013\bin


找到你的QML所在的目录,然后我需要相对于什么传递QML目录路径?我需要将QML文件复制到“创建的某个地方”的新目录中吗? - Bersan

2

@ddriver 目前什么情况下不是这样? - FourtyTwo
部署工具无法正常工作,无论是对于DLL文件还是QML文件都是如此。它无法收集所需的文件,甚至会收集根本不需要的项目文件。它已经彻底崩溃了。 - dtech
2
自从Qt 5.3以来,我一直在使用部署工具,它非常好用 - 我的项目相当大,一些dll依赖项甚至来自qml文件。一旦您包含了qml资源(正如jkj yuio在他的答案中正确指出的那样,并且如我所链接的文档所告诉您的那样),您将需要--qmldir参数才能让它正常工作。在发现这个开关之前,我也曾遇到过您提到的同样问题;-) - FourtyTwo
我正在按照预期使用这个工具,但它却无法正常工作。请注意,我正在使用64位版本,也许32位版本会更好用... - dtech
@ddriver,你提交了错误报告吗? - Mitch
显示剩余3条评论

1

BaCaRoZzo所述,对于我来说相当有效的通用解决方案是按照这个指南进行操作。

总之,在一个空目录中复制以下内容:

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

首先,在测试应用程序时,请将qt文件夹重命名,以便$PATH找不到它,并双击MyApp.exe。这应该运行程序。

< p > < em > 注意: 这会导致一个非常大的应用程序,因此您需要删除一些额外的文件和文件夹。 最简单的方法是对于dll:您运行程序,在运行时,删除新项目中的所有dll。只有那些不被MyApp.exe使用的dll才会被删除。高效!< br /> 对于Qt文件夹,请通过试错方法进行。

在一个集成、独立的开发环境中,你可能会认为只需按下一个按钮就能像其他编程语言或框架一样获得可执行文件...但是,在QT中,你需要遵循一个指南,告诉你要遵循另一个指南,基本上是手动复制你需要的每个文件。为什么他们甚至发布新版本,而旧版本甚至不能做你可以要求的最基本的事情? - Bersan

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版本,只需从安装程序安装应用程序即可。


0

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


0

对于我来说,这个答案有效用于QtQuick 2应用程序(QML应用程序),但我正在添加更多细节:

  • 在Qt中以Release模式构建

  • 在文件资源管理器中找到包含可执行文件的文件夹,通常位于项目文件夹的同级目录

  • 将可执行文件复制到空文件夹中

  • 启动Qt CMD工具(我的是),进入包含可执行文件的文件夹并运行:

windeployqt --release --qmldir C:\Qt\5.15.1\msvc2015_64\qml executable.exe

(将5.15.1\msvc2015_64更改为您的版本)


0

我的答案是:

(1) 在Qt Framework中设置应用程序的Release模式。

(2) 之后:项目 -> 构建目录,并在“C:/”文件夹中设置一个空目录(我正在开发Windows 10)。例如:我的文件夹:“Release”,子文件夹:“My_app”,因此构建目录为“C:/Release/My_app”

(3) 单击“启动项目的调试”

(4) 在“C:/”目录下创建另一个文件夹(在我的情况下称为“Executable”,子文件夹为“My_app”)。

(5) 将“Release/My_app/release”文件夹中的“My_app.exe”复制到“C:/Executable/My_app”中。

(6) 打开Qt mingw。

(7) 在Qt MinGw的终端上通过命令“cd C:/Executable/My_app”进入文件夹“Release/My_app/release”

(8) 运行命令“windeploy.exe My_app.exe --qmldir 'full_path_where_are_the_qml_files'”(例如:“C:/My_prj/qmlsource”,其中qmlsource是包含我的qml_files的文件夹)。

这将生成运行My_app.exe所需的所有文件。只需复制整个文件夹(My_prj文件夹)即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接