Qt项目开发遇到的问题5:加载dll,既创建lib模块,详解一下什么是接口。
加载模块是一个重要的功能,上篇说了如何在主程序中添加已有的模块,那么本篇就来说一下如何创建一个lib模块!或许你会觉得添加类来实现功能
也可以啊,确实,其实我们可以把lib模块看成一个类!但坏处就是些别的程序我也要使用时,就需要再次添加这个类,有点麻烦哦,而直接封装成lib模块
是不是感觉很棒,模块化绝对是非常好的模式!届时添加也不需要再添加.h 和.cpp啦!
接口的事情我放在了后面部分,请耐心看下去吧!
首先 .pro文件的内容有所不同:

剩下的就和普通程序没什么不同了。
接下来就是之前说到的接口,通俗的来说,如果整个程序是一个乐高积木的话,这个dll文件就相当于是一个自己打造的一个小积木,这个dll里面封装了一些功能
可以让外部调用,也可以在dll中直接实现,这就是模块化的核心含义了,这样的好处就是弱耦合,对于不了解这个程序的人来说也可以拿过来直接使用,也无需再查
看我们的源码,您说是不是非常便捷呢。接口就是这个小积木上面的小凸起或者小凹槽,我们既可以从外部获取数据进行内部的操作,也可以在内部产生一个需要的
数据。空口无凭,有例子就好了!
接下来我们看一下接口:
头文件:
#ifndef FORM_H #define FORM_H #include <QDialog> namespace Ui { class Form; } //主框架接口框架 #define afs s_instance->GetSysCtrl() class Form : public QWidget,public IModules { Q_OBJECT public: explicit Form(QWidget *parent = nullptr); ~Form(); static Form* instance(QWidget*); //单例模式 virtual QIcon *GetModuleIcon() override; virtual QString *GetModuleText()override; void setSysCtrl(IFrame *framectrl) override; IFrame* GetSysCtrl(){return m_framectrl;} private: stateandcmd *sta_cmd; Ui::Form *ui; static Form* s_instance; }; #endif // FORM_H
.cpp进行实现
//单例模式 Form* Form::s_instance = NULL; Form* Form::instance(QWidget* widget) { if (NULL == s_instance) { s_instance = new Form(widget); s_instance->hide(); } return s_instance; } void Form::setSysCtrl(IFrame *framectrl) { m_framectrl = framectrl; } QIcon* Form::GetModuleIcon() { QIcon *icon = new QIcon(":/set2.png"); return icon; } QString* Form::GetModuleText() { return new QString("管理员控制"); }
通过这些接口就可以调用dll当中的函数了,这里包括创建一个单例对象,然后返回本模块的名字、模块的图标。这里是函数的实现,把之前头文件的函数切实
的实现出来。注意注意!重点来了,为什么定义时候是虚函数嘞???我比较菜鸡,用我理解的方式来说,就是提高复用性,这样第一可以继承这个函数,如
此一来可以不用破坏模块里面的核心代码啦,而且因为是虚函数,我们就必须要实现他,保证了这个接口确实是有效的,可用的。
今天就到这里吧,打工仔该休息了,之后说一些功能的实现吧,之前说的都算是基础的通用的东西了,下一个阶段说一些比如udp通信一类的功能吧。

浙公网安备 33010602011771号