C++ SVG图标未显示在windows中的Qt4发行版中

C++ SVG图标未显示在windows中的Qt4发行版中,c++,windows,svg,qt4,mingw,C++,Windows,Svg,Qt4,Mingw,我有一个带有SVG图标的Qt4应用程序,用mingw(在windows中)编译,链接到Qt共享库 当应用程序运行时,SVG图标显示在linux的调试和发布版本中,但在windows中,SVG图标仅显示在调试版本中,而不显示在发布版本中 所有SVG图标都列在project.qrc中,并且project.pro具有RESOURCES=project.qrc。应用程序使用QtSvg4.dll(版本4.7.0) Qt4.7.0,QtCreator 2.0.1,mingw/g++4.4.0 解决方案更新:

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

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

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

Qt4.7.0,QtCreator 2.0.1,mingw/g++4.4.0


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

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

特别是,确保SVG插件加载了以下内容:


QImageReader::supportedimagefromts()

您很可能需要包含来自qt目录的插件。这涉及到创建一个应用程序本地的qt.conf文件(请参见此处:,更具体地说是[path]部分),并将c:\qt\4.x.x\plugins\imageformats*.dll复制到可分发文件的目录中。

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

尝试了其他解决方案,例如将插件部署到名为imageformats的目录(在app目录中),并使用和不使用适当的qt.conf,但没有乐趣


注意:我以前使用Qt 4.7.0 dll运行应用程序,在同一台Win7目标计算机上没有问题。

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

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


简短:要呈现svg图像,您还需要包含xml DLL

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)
对于Qt5 自Qt5以来,该框架已高度模块化。
很可能您缺少svg模块。应用程序仍然可以毫无怨言地编译。确保SVG模块已安装在系统上并已链接(使用qmake、cmake或plain Make)。如果链接成功,将列出SVG

你猜对了:这里还有另一种方法,但要依赖互联网上的廉价建议

只需将这一行添加到你的
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 [...]
对于Qt 5.14 在.pro文件中添加一行

QT       += svg

你的图标代码是什么样子的?也许您有一些重要的调用被封装在assert/Q_assert中?弗兰克:谢谢你的回复。我看了看,它们没有被资产包裹。在代码和ui文件中设置图标,如下所示:QPushButton*buttonX=new QPushButton(QIcon(:/images/buttonX.svg”),“Do X”,this);或者:/images/iconX.svg:/images/iconX.svg。linux版本中也会显示图标。谢谢,就是这样。我必须在我的应用程序文件夹中创建/imageformats文件夹,并将qsvg4.dll复制到其中。我以前尝试过将qsvg4.dll与其他qt dll一起复制到应用程序文件夹中,但应用程序正在/imageformats(没有qt.conf的默认行为)下查找它。不建议使用链接,因为将来可能会死掉。好吧。。。未来就这样到来了。两个环节都没有了。