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

Qt plugins: is there a way to list all interfaces a plugin implements?

本文关键字:插件 实现 接口 有没有 Qt      更新时间:2023-10-16

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

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

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

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

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

你能做的最好的事情就是尝试将插件加载器返回的QObject * instance()转换为使用类名或其 IID 给定的给定接口,使用 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;
}

如果您希望依赖此功能,则需要修改moc的副本以从Q_INTERFACES自动生成相关的类信息。IIRC 这只是几行值得改变的地方,我在某个时候做过类似的事情。