Qt插件应用

13 篇文章 1 订阅

对于一个大型软件系统来说,实现plugin是一件很美妙的事情,一个成功的plugin系统可以使软件增色不少。Plugin最大的功能是在一定程度内提高了软件的灵活度和可扩展性。

一种是高等级的plugin。其实说白了就是已经确定interface的Qt本身的plugin;另一种是低等级的plugin。就是该plugin的interface也需要程序员自己编写

从编程的角度,重点还是OOP。所谓的plugin,其实就是一些按照特定interface写成的子类。该Interface必须是虚基类,且所有函数(除了析构)都是虚函数。而所谓的plugin就是继承该虚基类和QObject的子类。当程序调用该plugin的某个函数时,是通过该plugin的虚基类在运行时动态绑定至子类的vtable执行的。所以Qt实现plugin的基础还是OOP的继承和多态。(插件是一个实现了内部虚基类的一个DLL,核心也是继承和多态);

那么为什么该plugin类不但要继承interface类,还需要继承QObject类呢?原因是调用plugin时需要该plugin类QObject那部分的meta信息。如果大家看过例子代码,会发现,用QPluginLoader调用plugin的文件后,关键的一步是确定该plugin是什么类型的。简单的另人惊讶,一句qobject_cast就搞定了。刚看到这句我百思不得其解,好在Qt有源代码可看,看了源代码发现qobject_cast类似于标准C++的dynamic_cast,且无需RTTI支持并能跨DLL。在代码中,qobject_cast是通过QObject的metaobject的cast函数来实现的。

 

举个大家都知道的例子来说明,PhotoShop(可能它并不是这么实现的)的所有滤镜有个统一的interface虚基类,该类提供了一个虚函数doSomeWork用于实现滤镜效果;

当用户选择某个特殊滤镜时,程序会调用plugin中该滤镜class的doSomeWork实现函数来执行该操作,从而实现特定的滤镜功能。

 

你最适合在plugin中完成的代码是那些事务性的代码,即使用调用者的资源完成某些计算或操作。当你想在plugin中分配大量资源和组织一个庞大的类战队时,请三思!!

 

案例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值