Значки SVG не отображаются в сборке выпуска Qt4 в Windows

#c #windows #svg #qt4 #mingw

#c #Windows #svg #qt4 #mingw

Вопрос:

У меня есть приложение Qt4 с значками SVG, скомпилированное с помощью mingw (в Windows), связанное с разделяемыми библиотеками Qt.

При запуске приложения значки SVG отображаются в сборках debug и release в Linux, однако в Windows значки SVG отображаются только в сборке debug, но не в сборке release.

Все значки SVG перечислены в project.qrc и project.pro имеет RESOURCES = project.qrc . Приложение использует QtSvg4.dll (версия 4.7.0).

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

Обновление решения: в каталоге приложения создайте /imageformats/ directory и поместите qsvg4.dll там вместо самого каталога приложения или создайте qt.conf файл с соответствующим путем. Дополнительная информация в разделе «Развертывание плагинов«.

Комментарии:

1. как выглядит ваш код значка? Может быть, у вас есть важные вызовы, завернутые в assert / Q_ASSERT? Тогда они могут не выполняться в режиме выпуска.

2. Фрэнк: Спасибо за ваш ответ. Я посмотрел, и они не были завернуты в утверждения. Значки устанавливаются в коде и файлах пользовательского интерфейса следующим образом: QPushButton * buttonX = new QPushButton(QIcon(«:/images/buttonX.svg»), «Do X», this); или <свойство name=»icon»><iconset><normaloff>:/images/iconX.svg</normaloff>:/images/iconX.svg</iconset></property>. Значки также отображаются в сборках выпуска Linux.

Ответ №1:

Скорее всего, вам придется включить плагины из вашего каталога qt. Для этого необходимо создать файл qt.conf, который является локальным для вашего приложения (смотрите Здесь: http://doc.qt.io/qt-4.8/qt-conf.html , более конкретно в разделе [Пути]), и скопируйте c:Qt4.x.xpluginsimageformats *.dll в каталог вашего дистрибутива.

Комментарии:

1. Спасибо, это было оно. Мне пришлось создать папку / imageformats в папке моего приложения и скопировать qsvg4.dll в него. Ранее я пытался скопировать qsvg4.dll в папку приложения вместе с другими библиотеками DLL qt, но приложение искало их в /imageformats (поведение по умолчанию без qt.conf).

Ответ №2:

для Qt 5.14 добавьте строку в файл .pro

 QT        = svg
  

Ответ №3:

Для Qt5

Начиная с Qt5 платформа была сильно модульной (список модулей). Скорее всего, вам не хватает модуля svg. Приложение по-прежнему будет компилироваться без жалоб. Убедитесь, что модуль SVG установлен в вашей системе и связан (с qmake (Howto), cmake (Howto) или обычным make). Если ссылка была выполнена успешно, QImageReader::supportedImageFormats() отобразит SVG.

Ответ №4:

Для моего приложения (Qt 4.6.3) я решил эту проблему, установив подключаемый модуль dll (qsvgicon4.dll ) в каталоге под названием iconengines в каталоге приложения.

Пробовал другие решения, такие как развертывание плагина в каталоге (внутри каталога приложения) с именем imageformats с соответствующим qt.conf или без него, но безрезультатно.

Примечание: ранее я запускал приложение с библиотеками DLL Qt 4.7.0 и у меня не было проблем на том же целевом компьютере Win7.

Ответ №5:

Как вы уже догадались: вот еще один способ не читать документы, а вместо этого положиться на дешевые советы из Интернета.

Просто добавьте эту строку в свой 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()

Комментарии:

1. Ссылки на SO не рекомендуется использовать, поскольку они могут быть недоступны в будущем.

2. Что ж … и вот будущее наступило. Обе ссылки недоступны.

Ответ №7:

Похоже, что проблема с Qt5.1 в Windows все еще существует, вот как я решил ее для пользователей 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 также входит в стандартные библиотеки DLL core, gui и svg.

Вот как я решил это для себя.

Кратко: для рендеринга изображений svg вам также необходимо включить xml DLL