(二)入口软件

        我们首先来说一下入口文件的事情,入口文件相当简单,只需要创建一个exe文件就好了。

        这个项目我命名位fridayapp。       

       源代码

        fridayapp 头文件

/*
fridayapp.h
*/
#include <QMainWindow>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>
#include "../za_lib/plugin_start.h"
class Fridayapp : public QMainWindow
{
    Q_OBJECT

public:
    Fridayapp(QWidget *parent = 0);
    ~Fridayapp();
private:
    Pluginstart _pluginstart;//"../za_lib/plugin_start.h"里面的内容
    QString _start_name;
    QMenuBar *_menubar_main;
    QToolBar *_toolbar_main;

    QWidget     *_ui;
    QGridLayout *_layout;
    QLabel      *_label;
private:
    void _read_config(void);
    void _loader_plugin(void);
    void _set_information(void);
public slots:
    void _slot_start_to_mian();
};
firday cpp 文件
/*
fridayapp.cpp
*/
#include "fridayapp.h"
#include <QtSerialPort>
#include <QtNetwork>
#include "config.h"

#include "../za_lib/plugin_start.h"
Fridayapp::Fridayapp(QWidget *parent)
    : QMainWindow(parent)
{
    QSerialPort *serial =new QSerialPort;
    QTcpServer  *server =new QTcpServer;
    delete serial;
    delete server;

    _set_information();
    _read_config();
    _loader_plugin();

   _menubar_main=this->menuBar();
   _toolbar_main= this->addToolBar("");


   Pluginstart *Pplugin=&_pluginstart;
   QPluginLoader *pluginloader;
   quint8      sta;

   sta=Myplugin::PluginStart::Init_PluginStart(Pplugin,&pluginloader);

   if(sta==0x00)
   {
       _ui=new QWidget;
       _layout=new QGridLayout;
       _label =new QLabel("未找到指定插件");
       _ui->setLayout(_layout);
       _layout->addWidget(_label);

   }
   else if(sta==0x01)
   {
       _ui=new QWidget;
       _layout=new QGridLayout;
       _label =new QLabel("插件加载失败");
       _ui->setLayout(_layout);
       _layout->addWidget(_label);
   }
   else if(sta==0x02)
   {
       Pplugin->plugin=pluginloader->instance();
       Pplugin->ptr=std::unique_ptr<Myplugin::PluginStart>(qobject_cast<Myplugin::PluginStart *>(Pplugin->plugin));
       Pplugin->ptr->GetTaskWidget(&_ui);

       connect(Pplugin->plugin,SIGNAL(Signal_start_to_main()),this,SLOT(_slot_start_to_mian()));
   }

   setCentralWidget(_ui);
   setWindowTitle("fridayapp");
}

Fridayapp::~Fridayapp()
{

}

void Fridayapp::_read_config()
{
    Config      *config =new Config;
    QString node="a_friday";
    QString name="start_name";
    QString *value=&_start_name;
    config->config_getValue(&node,&name,value);
}

void Fridayapp::_loader_plugin()
{

}

void Fridayapp::_set_information()
{

}

void Fridayapp::_slot_start_to_mian()
{

}

config.h

/*
config.h
*/

#include <QWidget>

class Config : public QWidget
{
    Q_OBJECT
public:
    explicit Config(QWidget *parent = nullptr);
   ~Config();
public:
    void config_setValue(QString *node,QString *name,QString *value);//写入配置文件内容
    void config_getValue(QString *node,QString *name,QString *value);//读取配置文件内容
    void Get_config_path(QString *str);//获取当前文件储存的目录
    void Set_config_path(QString str);//设置文件储存的目录
private:
   QString _path;
signals:

public slots:
};

config.cpp

/*config.cpp*/
#include "config.h"
#include <QDir>
#include <QFileInfo>
#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
Config::Config(QWidget *parent) : QWidget(parent)
{
    _path=(char*)0;
    _path=QCoreApplication::applicationDirPath()+"/config/";//文件夹
    QDir dir(_path);
    QFileInfo fileInfo(_path);
    if(!fileInfo.isDir())//检测文件夹应该用 QFileInfo::isDir,如果没有就新建文件夹
        dir.mkdir(_path);
    _path=_path+"config.ini";//文件名
}

Config::~Config()
{

}

void Config::config_setValue(QString *node, QString *name, QString *value)
{
    QSettings *setting=new QSettings(_path,QSettings::IniFormat);
    setting->setValue(*node+"/"+*name,*value);
    delete setting;
}

void Config::config_getValue(QString *node, QString *name, QString *value)
{
    QSettings *setting=new QSettings(_path,QSettings::IniFormat);
    QString str=setting->value(*node+"/"+*name).toString();
    if(str.isEmpty())
        config_setValue(node,name,value);
    else
        *value=str;

    delete setting;
}

void Config::Get_config_path(QString *str)
{
    *str=_path;
}

void Config::Set_config_path(QString str)
{
    _path=str;
}

plugin_start.h

/*
plugin_start.h
*/
#include <QMenuBar>
#include <QToolBar>
#include <memory>
#include <QDir>
#include <QFileInfo>
#include <QPluginLoader>
#include <QCoreApplication>
#include <QFileInfo>

#define start_interface_iid "PluginStart 1.0"
typedef struct PLUGINSTART  Pluginstart;
namespace Myplugin
{
 class PluginStart
 {

 public:
     virtual ~PluginStart(){}
     virtual void GetTaskWidget(QWidget **pui)=0;//获取ui
     virtual void set_menubar_and_toolbar(QMenuBar **menubar,QToolBar **toolbar)=0;
signals:
     virtual void Signal_start_to_main()=0;
     virtual void Singla_main_to_start()=0;
 public:
     static quint8 Init_PluginStart(Pluginstart *Pplugin,QPluginLoader **PpluginLoader)
     {
         QString path=nullptr;
         path=QCoreApplication::applicationDirPath()+"/lib";
         QDir dir(path);
         QFileInfo fileInfo_file_directory(path);
         if(!fileInfo_file_directory.isDir())//检测文件夹应该用 QFileInfo::isDir,如果没有就新建文件夹
             dir.mkdir(path);
         path+="/start.dll";
         QFileInfo fileInfo_file(path);

         if(!fileInfo_file.isFile())//检查需要打开的dll文件在不在
         {
             return 0x00;
         }

         QPluginLoader *pluginLoader=new QPluginLoader(path);//加载插件

         if(!pluginLoader->load())
         {
             return 0x01;
         }

         *PpluginLoader=pluginLoader;
         return 0x02;
     }
 };
}

struct  PLUGINSTART
{
      QObject *plugin;
      std::unique_ptr<Myplugin::PluginStart> ptr;
};

Q_DECLARE_INTERFACE(Myplugin::PluginStart,start_interface_iid)

#endif // PLUGIN_START_H

mian.cpp

/*
main.cpp
*/
#include "fridayapp.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Fridayapp w;
    w.show();

    return a.exec();
}

        这样,就创建好了一个入口文件。这个入口文件到现在为止是没有任何作用的。

编译好了以后,它只有一个启动的作用。当然,这个文件创建以后,就不会有改动了。

插件部分最重要的涉及到纯虚函数的部分,我想等我有时间,我会对代码进行一个解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值