Qt Plugin笔记

1、理念是App定义接口,Dll实现接口,因此接口定义源文件是在App这里。

2、Dll没有导出类名这个说法,因为这些类App压根是看不见的,也就是说Dll并不是提供它内部的类名给App,App只是调用App自己定义的接口,只不过这些接口是由Dll内部类实现的,App通过QPluginLoader.instance()函数拿到了指向Dll提供的类对象的指针,这实际上就是导出类的对象指针(即接口的派生类的指针),但是对于App来说它无需关注这个派生类名,它只要按接口定义使用就行了。

3、Q_DECLARE_INTERFACE(可以看该宏定义)实际上是定义了几个qobject_cast函数,用于App将加载的plugin对象指针动态转换为接口指针(因此这个宏是定义在App里的)。一条该宏只能定义一个接口类。这个宏可以理解成“App说,我声明了这些接口,就这么用。”

4、Q_INTERFACES是定义在Dll里的用于实现接口的派生类里,一条宏可以定义该类实现的所有接口,各接口之间用空格分开。这个宏可以理解成“Dll说,好,我实现了这些接口。”

5、从QPluginLoader的帮助文档看,提到了插件的root component,也就是说一个插件对外只能提供种类的对象,也就是QPluginLoader.instance()返回的那个。

6、Q_PLUGIN_METADATA让moc生成导出函数qt_plugin_instance(),供QPluginLoader()调用,创建接口实例,不过返回的是一个QObject*.

7、Qt里根本就不存在“QPlugin”这么一个类,Qt的插件机制更像是对于C++抽象类(即定义接口)的一个丰富,插件不一定独立在一个DLL里,它完全可以和应用程序在一个程序中,在这个时候它实际上就是个普通的C++抽象机制,而且这时候也不需要QPluginLoader。

参考:

 (1)  https://www.cnblogs.com/warmlight/p/12626797.html?ivk_sa=1024320u

(2)Qt源码例子:C:\Qt\Qt5.9.6\Examples\Qt-5.9.6\widgets\tools\plugandpaint

(3)QT插件机制中宏Q_PLUGIN_METADATA和Q_INTERFACES的作用_wangw8507的博客-CSDN博客_qt插件机制

(4)Qt的元对象(Meta-Object)系统简介_viclee108的博客-CSDN博客 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值