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通信一类的功能吧。

 

posted @ 2020-08-20 20:32  邱丑丑  阅读(297)  评论(0)    收藏  举报