c++ - Qt插件: is there a way to list all interfaces a plugin implements?

标签 c++ qt plugins moc

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

如果您查看下面链接的 Qt 文档,我正在谈论“低级”API: http://doc.qt.io/qt-5/plugins-howto.html

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

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

最佳答案

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

你能做的最好的事情就是尝试将插件加载器返回的QObject * instance()转换为使用类名或使用其IID给定的给定接口(interface),使用 qt_metacast,即loader.instance()->qt_metacast("IFoo")。如果结果非零,则给定的类实现该接口(interface)。

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

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 这只是几行值得改变的事情,我在某个时候做过类似的事情。

关于c++ - Qt插件: is there a way to list all interfaces a plugin implements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36849364/

相关文章:

c++ - 如何根据给定的字符长度拆分 QString?

c++ - 访问 QApplication::arguments 时出现段错误

php - 从开发的角度来看,主要内容管理系统的优点/缺点是什么?

java - NoSuchMethodError : com. google.common.cache.CacheBuilder.maximumSize(J)

java - 如何在 IntelliJ 上设置 CHelper 并进行配置?

c++ - 继承 SFML 中的 Transformable 和 Drawable

c++ - strcspn() 和 strpbrk() 有什么区别?

c++ - 3D 模型的均匀采样

c++ - 如何在我的QT项目中导入QWebView?

c++ - QMYSQL 驱动未加载 Qt 5.6 Linux Ubuntu 16.04