【问题标题】:SVG icons not showing up in Qt4 release build in windowsSVG 图标未显示在 Windows 中的 Qt4 版本中
【发布时间】:2011-05-18 04:00:57
【问题描述】:

我有一个带有 SVG 图标的 Qt4 应用程序,使用 mingw 编译(在 Windows 中),链接到 Qt 共享库。

当应用程序运行时,SVG 图标显示在 linux 中的调试和发布版本中,但在 Windows 中,SVG 图标仅在调试版本中显示,而不在发布版本中显示。

所有 SVG 图标都列在 project.qrc 中,project.proRESOURCES = project.qrc。应用程序使用 QtSvg4.dll(版本 4.7.0)。

Qt 4.7.0、Qt Creator 2.0.1、mingw/g++ 4.4.0。

解决方案更新: 在应用程序目录中,创建/imageformats/ 目录并将qsvg4.dll 放在那里而不是应用程序目录本身,或者创建一个具有适当路径的qt.conf 文件。更多信息在deploying plugins

【问题讨论】:

  • 您的图标代码是什么样的?也许您有重要的调用包含在 assert/Q_ASSERT 中?那么它们可能不会在发布模式下执行。
  • 弗兰克:感谢您的回复。我看了看,它们没有被包裹在断言中。图标在代码和 ui 文件中设置如下: QPushButton *buttonX = new QPushButton(QIcon(":/images/buttonX.svg"), "Do X", this);或 :/images/iconX.svg:/images/iconX.svg。图标也会出现在 linux 发行版本中。

标签: c++ windows svg qt4 mingw


【解决方案1】:

您很可能必须从您的 qt 目录中包含插件。这包括制作一个本地应用程序的 qt.conf 文件(请参见此处:http://doc.qt.io/qt-4.8/qt-conf.html,更具体地说是 [Paths] 部分),并将 c:\Qt\4.xx\plugins\imageformats*.dll 复制到您的可分发的目录。

【讨论】:

  • 谢谢,就是这样。我必须在我的应用程序文件夹中创建 /imageformats 文件夹并将 qsvg4.dll 复制到其中。我之前尝试将 qsvg4.dll 与其他 qt dll 一起复制到应用程序文件夹中,但应用程序正在 /imageformats 下寻找它(没有 qt.conf 的默认行为)。
【解决方案2】:

对于 Qt 5.14 在 .pro 文件中添加一行

QT       += svg

【讨论】:

    【解决方案3】:

    对于 Qt5

    自 Qt5 以来,该框架已高度模块化(List of Modules)。 您很可能缺少 svg 模块。该应用程序仍将编译而不会抱怨。确保 SVG 模块已安装在您的系统上并链接(使用 qmake (Howto)、cmake (Howto) 或普通 make)。如果链接成功QImageReader::supportedImageFormats() 将列出 SVG。

    【讨论】:

      【解决方案4】:

      对于我的 (Qt 4.6.3) 应用程序,我通过将插件 dll (qsvgicon4.dll) 放在应用程序目录中名为 iconengines 的目录中解决了这个问题。

      尝试了其他解决方案 - 例如将插件部署到名为 imageformats 的目录(在应用程序目录内),有或没有适当的 qt.conf,但没有任何乐趣。

      注意:我之前使用 Qt 4.7.0 dll 运行该应用程序,并且在同一台 Win7 目标机器上没有问题。

      【讨论】:

        【解决方案5】:

        您猜对了:这是avoid reading the docs 的另一种方式,但要依赖互联网上的廉价建议。

        只需将此行添加到您的app.pro

        QTPLUGINS += qsvg
        

        在我的例子中,Qt 是从 MSYS2 静态链接的,所以插件 DLL 甚至不存在。但是应用程序仍然需要链接到 imageformats/qsvg 插件代码。上面的 qmake 行是最简单的方法;它转换为g++ 链接线段,如下所示:

        g++ [...] -LC:/msys64/mingw64/qt5-static/share/qt5/plugins/imageformats \
                  C:/msys64/mingw64/qt5-static/share/qt5/plugins/imageformats/libqsvg.a [...]
        

        【讨论】:

          【解决方案6】:

          根据您所说的,您正在尽一切努力使其正常工作,因此正确的答案可能需要更多信息。看看这些链接是否对您有用:

          http://lists.trolltech.com/qt-interest/2008-10/msg00655.html

          http://www.qtcentre.org/archive/index.php/t-9036.html

          特别是,确保 SVG 插件正在加载:

          QImageReader::supportedImageFromats()

          【讨论】:

          • 不鼓励在 SO 上链接,因为将来可能会
          • 嗯...所以未来已经到来。两个链接都失效了。
          【解决方案7】:

          Windows 中的 Qt5.1 似乎仍然存在问题,这里我是如何为 cmake 用户解决的:

          Find_File(qtsvg NAMES "Qt5Svg.dll" PATHS ${QTBinBase}/.. PATH_SUFFIXES "bin" )
          Find_File(qtxml NAMES Qt5Xml.dll PATHS ${QTBinBase}/.. PATH_SUFFIXES "bin" )
          Find_File(qsvg NAMES "qsvg.dll" PATHS ${QTBinBase}/.. PATH_SUFFIXES "plugins/imageformats" )
          Find_File(qsvgicon NAMES "qsvgicon.dll" PATHS ${QTBinBase}/.. PATH_SUFFIXES "plugins/iconengines" )
          
          install(FILES ${qtsvg} ${qtxml} DESTINATION bin)
          install(FILES ${qsvg} DESTINATION bin/plugins/imageformats)
          install(FILES ${qsvgicon} DESTINATION bin/plugins/iconengines)
          

          它是手动方式,不美观但有效。 QTBinBase 我得到了另一个肮脏的把戏:

          get_target_property(QtCore_location Qt5::Core LOCATION)
          get_filename_component(QtBinBase ${QtCore_location} PATH)
          

          【讨论】:

            【解决方案8】:

            如果添加 Qt4Svg.dll 和 imageformats/qsvg4.dll 不起作用,请确保 Qt4Xml.dll 也包含在标准核心、gui 和 svg DLL 中。

            这就是我为我解决这个问题的方法。

            简短:要渲染 svg 图像,您还需要包含 xml DLL

            【讨论】:

              猜你喜欢
              • 2019-06-02
              • 1970-01-01
              • 2017-05-02
              • 1970-01-01
              • 2018-08-24
              • 2014-02-22
              • 1970-01-01
              • 2017-10-19
              • 2021-08-24
              相关资源
              最近更新 更多