我有一个允许自定义插件(加载QPluginLoader
)的Qt应用程序,这些插件可以实现一些接口,并使用Q_INTERFACES()
宏进行声明。
如果你看一下下面链接的Qt的文档,我就是在讨论低级""低级" API: http://doc.qt.io/qt-5/plugins-howto.html
现在,这是我的问题:在我用QPluginLoader
加载插件后,有没有办法枚举它实现的所有接口?基本上,有没有办法枚举插件在加载插件的主应用程序中在Q_INTERFACES()
宏中声明的内容?
该应用程序目前适用于Qt4和Qt5,但也可以使用仅适用于Qt5的解决方案。
答案 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只是改变的几行,我在某些时候做过类似的事情。