Загрузка плагинов Qt при статической ссылке на Qt? - PullRequest
9 голосов
/ 02 октября 2009

Я пытаюсь использовать SVG-графику в QIcons. У меня есть статическая библиотека, которая содержит все мои графические ресурсы, и метод в этой статической библиотеке, который возвращает QIcon, предварительно загруженные с правильной графикой. Я пытаюсь сделать это:

QIcon icon(":/icons/find.svg");

Я подтвердил, что ресурсы были загружены, перечислив его с помощью QDir:

qDebug() << QDir(":/icons/").entryList();

Однако значок SVG не отображается. Когда я меняю код загрузки иконки на этот:

QIcon icon(":/icons/find.png");

все работает правильно.

Проблема в том, что плагин SVG никогда не загружается. Я могу получить список поддерживаемых типов изображений, который содержит:

("bmp", "pbm", "pgm", "png", "ppm", "xbm", "xpm")

но без упоминания SVG.

Я убедился, что использую модуль SVG как в своем статическом файле .pro, так и в главном .pro файле приложения.

Edit:

Кажется, проблема в том, что я статически связываюсь с Qt, и, таким образом, все плагины являются статическими библиотеками. Документация для QPluginLoader гласит:

Обратите внимание, что QPluginLoader не может быть используется, если ваше приложение статически связаны с Qt. В этом случае вы также придется ссылаться на плагины статически. Вы можете использовать QLibrary, если вам нужно загрузить динамические библиотеки в статически связанное приложение.

Тем не менее статическая ссылка на эти плагины, похоже, ничего не делает (список поддерживаемых форматов изображений не увеличивается).

Edit2:

Кроме того, динамическая ссылка на Qt (после перестройки всего моего приложения) делает приведенный выше код отлично работающим. Однако я хочу, чтобы статически связывался с Qt, поэтому теперь вопрос заключается в том, чтобы больше загружать плагины Qt при статической ссылке на Qt, а не в целом по иконкам. Я обновлю название поста, чтобы отразить это.

Ответы [ 2 ]

11 голосов
/ 02 октября 2009

Вам нужно использовать Q_IMPORT_PLUGIN.

См. Документацию здесь: https://doc.qt.io/qt-5/qtplugin.html#Q_IMPORT_PLUGIN

1 голос
/ 02 октября 2009

Согласно документации способ загрузки иконки svg:

QSvgRenderer svgRenderer( ":/icons/find.svg" );
Q_ASSERT( svgRenderer.isValid());

QImage img( svgRenderer.defaultSize() );
QPainter p( &img );
svgRenderer.render( &p );
p.end();

QIcon icon( QPixmap::fromImage( img ) );

Для вашей проблемы со связью QtSvg является частью Qt, поэтому вам не нужно добавлять его как плагин. Единственное, что требуется для компиляции с поддержкой SVG:

QT += svg
...