我们首先来说一下入口文件的事情,入口文件相当简单,只需要创建一个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();
}
这样,就创建好了一个入口文件。这个入口文件到现在为止是没有任何作用的。
编译好了以后,它只有一个启动的作用。当然,这个文件创建以后,就不会有改动了。
插件部分最重要的涉及到纯虚函数的部分,我想等我有时间,我会对代码进行一个解释。