静态链接到 Qt 时加载 Qt 插件?

Posted

技术标签:

【中文标题】静态链接到 Qt 时加载 Qt 插件?【英文标题】:Loading Qt plugins when linking to Qt statically? 【发布时间】:2009-10-02 08:32:24 【问题描述】:

我正在尝试在 Qicons 中使用 SVG 图形。我有一个包含所有图形资源的静态库,以及该静态库中的一个方法,该方法返回预加载了正确图形的 QIcons。我正在尝试这样做:

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。

我已确定在我的静态库 .pro 文件和我的主应用程序 .pro 文件中都使用了 SVG 模块。

编辑:

问题似乎是我静态链接到 Qt,因此插件都是静态库。 QPluginLoader 的文档指出:

请注意,QPluginLoader 不能 如果您的应用程序是静态的,则使用 与 Qt 相关联。在这种情况下,您 还必须链接到插件 静态的。您可以使用 QLibrary 如果 你需要加载动态库 一个静态链接的应用程序。

然而,静态链接到这些插件似乎无济于事(支持的图像格式列表没有增加)。

编辑2:

此外,动态链接到 Qt(在重建我的整个应用程序之后)可以使上面的代码完美运行。但是,我想要静态链接到 Qt,所以现在的问题看起来更多是关于在静态链接到 Qt 时加载 Qt 插件,而不是一般的图标。我将更新帖子标题以反映这一点。

【问题讨论】:

【参考方案1】:

您需要使用 Q_IMPORT_PLUGIN。

在此处查看文档:https://doc.qt.io/qt-5/qtplugin.html#Q_IMPORT_PLUGIN

【讨论】:

【参考方案2】:

根据documentation,加载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

【讨论】:

对于普通应用程序,是的。但是,图标是不同的。 QIcon 文档 (doc.trolltech.com/4.5/qicon.html) 提示使用 svg 图标引擎,您应该能够将 SVG 图像直接加载到 QIcons 中。其他人也有这项工作 (lists.trolltech.com/qt-interest/2008-07/thread00105-0.html),只是不是在静态环境中。 对不起,我刚刚意识到上面的评论是模棱两可的。第一句中的“应用程序”是指“使用”,而不是“应用程序”。

以上是关于静态链接到 Qt 时加载 Qt 插件?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序如何链接静态QT Plugin库

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

Qt系列文章之三十七(基于QWidget 创建和使用静态链接库)

使用静态 QT odbc 时如何解决链接问题

将静态 Qt 库链接到 c 程序

qt creator qt5.1 vs2010 使用静态库时链接器错误