SVG icons not showing up in Qt4 release build in w

2019-02-21 17:10发布

I have a Qt4 application with SVG icons, compiled with mingw (in windows), linked to Qt shared libraries.

When application is run, SVG icons show up in debug and release builds in linux, however in windows SVG icons show up only in debug build but not in release build.

All SVG icons are listed in project.qrc, and project.pro has RESOURCES = project.qrc. Application uses QtSvg4.dll (version 4.7.0).

Qt 4.7.0, Qt Creator 2.0.1, mingw/g++ 4.4.0.

Solution update: In application directory, create /imageformats/ directory and put qsvg4.dll there instead of application directory itself, or create a qt.conf file with appropriate path. More information in deploying plugins.

6条回答
我欲成王,谁敢阻挡
2楼-- · 2019-02-21 17:31

For Qt5

Since Qt5 the framework has been heavily modularized (List of Modules). Most likely you are missing the svg module. The application will still compile without complaining. Make sure the SVG module is installed on your system and linked (with qmake (Howto), cmake (Howto) or plain make). If it was linked successfully QImageReader::supportedImageFormats() will list SVG.

查看更多
贼婆χ
3楼-- · 2019-02-21 17:42

Most likely you will have to include the plugins from your qt dir. This involves making a qt.conf file that is local to your app (see here: http://doc.qt.io/qt-4.8/qt-conf.html , more specifically the [Paths] section), and copy c:\Qt\4.x.x\plugins\imageformats*.dll to your distributable's directory.

查看更多
戒情不戒烟
4楼-- · 2019-02-21 17:46

It still seem to be a problem with Qt5.1 in Windows, here how I solved it for cmake users:

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)

Its the manual way, not beautiful but works. QTBinBase I got with another dirty trick:

get_target_property(QtCore_location Qt5::Core LOCATION)
get_filename_component(QtBinBase ${QtCore_location} PATH)
查看更多
戒情不戒烟
5楼-- · 2019-02-21 17:47

Based on what you've said, you're doing all that's needed for it to work, so a proper answer is likely to require some more information. See if these links are of any use to you:

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

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

In particular, make sure that the SVG plugin is getting loaded with:

QImageReader::supportedImageFromats()

查看更多
欢心
6楼-- · 2019-02-21 17:54

For my (Qt 4.6.3) application, I solved this by putting the plug-in dll (qsvgicon4.dll) in a directory called iconengines within the application directory.

Tried other solutions - such as deploying plugin to directory (within app directory) named imageformats with and without an appropriate qt.conf, but no joy.

Note: I previously ran the application with Qt 4.7.0 dlls and had no problems on the same Win7 target machine.

查看更多
姐就是有狂的资本
7楼-- · 2019-02-21 17:56

If adding the Qt4Svg.dll and the imageformats/qsvg4.dll doesn't work, make sure the Qt4Xml.dll is also included along the standard core, gui and svg DLLs.

This is how I solved this for me.

Short: to render svg images you need to include the xml DLL aswell

查看更多
登录 后发表回答