静态链接Qt时如何加载Qt插件?

9

我想在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的文档说明如下:

请注意,如果您的应用程序与Qt静态链接,则无法使用QPluginLoader。在这种情况下,您还必须静态链接到插件。如果需要在静态链接的应用程序中加载动态库,则可以使用QLibrary。

然而,静态链接到这些插件似乎没有任何作用(支持的图像格式列表不会增长)。

编辑2:

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

2个回答

12

1
根据文档,加载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文档(http://doc.trolltech.com/4.5/qicon.html)暗示使用SVG图标引擎,您应该能够直接将SVG图像加载到QIcons中。其他人也已经成功实现了这一点(http://lists.trolltech.com/qt-interest/2008-07/thread00105-0.html),只是没有在静态上下文中。 - Thomi
抱歉,我刚意识到上面的评论有歧义。第一句中的“applications”是指“用途”,而不是“应用程序”。 - Thomi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接