【问题标题】:Qt - Resources are always lost in exe built with Visual StudioQt - 使用 Visual Studio 构建的 exe 中的资源总是丢失
【发布时间】:2019-12-30 21:17:34
【问题描述】:

我正在尝试在 Visual Studio 2019 中使用 Qt 构建演示应用程序。我使用 Visual Studio IDE 中的 Qt VS 工具和 Qt 设计器来创建我的用户界面。我还使用 Qt SVG 模块来为我的用户界面使用 SVG 图像。

我实现了一个工作项目,只要我从 Visual Studio IDE 运行它,它就可以在调试和发布模式下运行良好。现在我想将它作为一个独立的 .exe 文件分发。为此,我尝试创建一个压缩存档,其中包含 .exe 本身、所需的 Qt DLL,当然还有接口所需的资源。

编译后的 .exe 可以在其自己的目录中毫无问题地执行,但是我在资源中添加的图像均不可见。我尝试了几种方法来解决这个问题,并阅读了许多解释如何在 exe 文件中使用和/或嵌入 Qt 资源的教程。它们都不适合我。

我已经尝试过:

  • 只需复制 .exe 目录中的图像,无论是否保留其目录层次结构,但只有 .png 和 .jpg 图像可见,所有 SVG 都丢失了。
  • 使用 Qt rcc.exe 工具编译一个 Qt 资源文件 (.rcc),并将其添加到 Visual Studio 资源中,无效。
  • 使用“创建基本 .pro 文件...”菜单项(也生成一个 .pri 文件)生成一个 .pro 文件并添加以下行,但没有成功:
RESOURCES += MyResName.qrc
  • 在我的源代码的不同位置添加以下行(主窗体构造函数、main() 函数...)。没有任何效果:
QResource::registerResource("MyResName.rcc");
...
Q_INIT_RESOURCE(MyResName)
  • 玩弄和混合上述想法,没有任何效果。

所以有人可以给我一个尽可能简单的解释,说明如何正确构建一个具有所需资源的 .exe 文件,该文件可能以独立的方式工作,使用 Qt 和 Visual Studio 2019,以便分发它,尊重以下约束:

  • 该项目是使用 Qt 和 Visual Studio 2019 开发的 C++ 项目。
  • 该项目使用 Qt,有一个使用 Qt Designer 构建的 .ui 文件,该文件嵌入了多个 SVG 和/或 PNG/JPG 图像,并且如果从 IDE 运行 exe,这些图像在设计时可见。
  • 该项目使用 .qrc 文件指向应用程序所需的图像(无论是否为 SVG)。
  • 图像通过 styleSheet 属性添加到 UI 组件中,如下所示:
image: url(resources/images/im-dropbox.svg) center center;
  • 其他资源文件,如 .pro、.pri、.rcc 等,可以毫无问题地生成。所需资源已很好地嵌入到生成的文件中(已验证)。

请帮帮我,因为这种情况让我很头疼。

【问题讨论】:

    标签: visual-studio qt resources embedded-resource


    【解决方案1】:

    我会按照我看到的顺序尝试涵盖我看到的所有问题。

    首先你不使用资源中的文件,Qt 资源文件路径以:/ 开头,例如从资源中设置一个图标(在 C++ 代码中)你会这样做:

    a.setWindowIcon(QIcon(":/images/window_title_ico.png"));

    现在,要直接从 Qt Designer 使用资源,您需要为每个 ui 文件添加您的 .qrc 文件(单击“编辑”图标,然后单击“打开资源文件”),然后您可以从资源中设置图标,查看打印画面(Qt设计器从VS开始)

    注意:您可以仔细检查生成的 .ui 文件(它是一个 xml 文件)以查看图标路径是否以 :/ 开头,然后您就知道您做对了。 //在.ui 文件中,你会看到类似:

    <pixmap resource="resources/resources.qrc">:/images/acceleration.svg</pixmap>

    //注意.qrc文件的相对路径,.svg文件路径以:/开头

    最后要在部署时显示.svg,我注意到您也需要部署Qt5Svg.dll(来自:PATH_2_QT\5.XX.X\msvcXXX_XX\bin)仅部署imageformats\qsvg.dll 是不够的。

    希望这有助于澄清一些事情!

    【讨论】:

    • 这是一个很好且解释清楚的答案。非常感谢,对我有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多