Qt 插件:有没有办法列出插件实现的所有接口?
Qt plugins: is there a way to list all interfaces a plugin implements?
我有一个允许自定义插件的Qt应用程序(用QPluginLoader
加载),这些插件可以实现一些接口,并用Q_INTERFACES()
宏声明。
如果您查看下面链接的 Qt 文档,我说的是 "low-level" API:
http://doc.qt.io/qt-5/plugins-howto.html
现在,这是我的问题:在我用QPluginLoader
加载一个插件后,有没有办法枚举它实现的所有接口?基本上,有没有办法从加载插件的主应用程序枚举插件在 Q_INTERFACES()
宏中声明的内容?
该应用程序目前适用于 Qt4 和 Qt5,但仅适用于 Qt5 的解决方案也是可以接受的。
不幸的是,Qt 没有明确保留接口列表:(
你能做的最好的事情是尝试将插件加载器返回的 QObject * instance()
转换为给定的接口,使用 class 名称或使用其 IID,使用 qt_metacast
,即loader.instance()->qt_metacast("IFoo")
。如果结果非零,则给定的 class 实现接口。
或者,您可以将每个接口添加为 class 信息,然后您可以枚举它们:
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;
}
如果您希望依赖此功能,您需要修改 moc
的副本以从 Q_INTERFACES
自动生成相关 class 信息。 IIRC 这只是几行值得改变的地方,我在某些时候做过类似的事情。
我有一个允许自定义插件的Qt应用程序(用QPluginLoader
加载),这些插件可以实现一些接口,并用Q_INTERFACES()
宏声明。
如果您查看下面链接的 Qt 文档,我说的是 "low-level" API: http://doc.qt.io/qt-5/plugins-howto.html
现在,这是我的问题:在我用QPluginLoader
加载一个插件后,有没有办法枚举它实现的所有接口?基本上,有没有办法从加载插件的主应用程序枚举插件在 Q_INTERFACES()
宏中声明的内容?
该应用程序目前适用于 Qt4 和 Qt5,但仅适用于 Qt5 的解决方案也是可以接受的。
不幸的是,Qt 没有明确保留接口列表:(
你能做的最好的事情是尝试将插件加载器返回的 QObject * instance()
转换为给定的接口,使用 class 名称或使用其 IID,使用 qt_metacast
,即loader.instance()->qt_metacast("IFoo")
。如果结果非零,则给定的 class 实现接口。
或者,您可以将每个接口添加为 class 信息,然后您可以枚举它们:
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;
}
如果您希望依赖此功能,您需要修改 moc
的副本以从 Q_INTERFACES
自动生成相关 class 信息。 IIRC 这只是几行值得改变的地方,我在某些时候做过类似的事情。