Qt插件:有没有办法列出插件实现的所有接口?

时间:2016-04-25 19:25:18

标签: c++ qt plugins moc

我有一个允许自定义插件(加载QPluginLoader)的Qt应用程序,这些插件可以实现一些接口,并使用Q_INTERFACES()宏进行声明。

如果你看一下下面链接的Qt的文档,我就是在讨论低级""低级" API: http://doc.qt.io/qt-5/plugins-howto.html

现在,这是我的问题:在我用QPluginLoader加载插件后,有没有办法枚举它实现的所有接口?基本上,有没有办法枚举插件在加载插件的主应用程序中在Q_INTERFACES()宏中声明的内容?

该应用程序目前适用于Qt4和Qt5,但也可以使用仅适用于Qt5的解决方案。

1 个答案:

答案 0 :(得分:1)

不幸的是,Qt没有明确保留接口列表:(

您可以做的最好的方法是尝试使用QObject * instance(),使用qt_metacast,使用loader.instance()->qt_metacast("IFoo")将插件加载器返回的class Impl : public QObject { Q_OBJECT Q_INTERFACES(IFoo IBar) Q_CLASSINFO("Interface", "IFoo") Q_CLASSINFO("Interface", "IBar") } QStringList interfaces(QObject * obj) { QStringList result; auto count = obj->metaObject()->classInfoCount(); for (int i = 0; i < count; ++i) { auto info = obj->metaObject()->classInfo(i); if (strcmp(info.name(), "Interface") == 0) result << QString::fromLatin1(info.value()); } return result; } 转换为给定的接口,即{{1} }}。如果结果非零,则给定的类实现接口。

或者,您可以将每个接口添加为类信息,然后可以枚举它们:

moc

如果您希望依赖此功能,则需要修改Q_INTERFACES的副本,以便从[ { "id":1, "a":22, "b":11 }, { "id":1, "e":44, "c":77, "f":55, "d":66 }, { "id":3, "b":11, "a":22 }, { "id":3, "d":44, "c":88 } ] 自动生成相关的classinfo。 IIRC只是改变的几行,我在某些时候做过类似的事情。