Qt插件:有没有办法列出插件实现的所有接口
Qt plugins: is there a way to list all interfaces a plugin implements?
我有一个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 这只是几行值得改变的地方,我在某个时候做过类似的事情。
相关文章:
- 从C++本机插件更新Vector3数组
- 如果没有malloc,链表实现将失败
- 使用CMake创建QML插件
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 实现动态插件管理器
- 如何为模块化应用程序实现C++插件系统
- Qt插件:有没有办法列出插件实现的所有接口
- 两个插件链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so)
- 如何以符合标准的方式实现c++插件
- 实现节点插件在Xcode
- 如何为我的插件实现自定义数字签名