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插件机制