当前位置: 首页 > wzjs >正文

淄博优化网站排名网站的技术方案

淄博优化网站排名,网站的技术方案,经营网站 备案,wordpress 投稿页面参考链接: 1、【QT】Qt Plugin开发 2、Qt 插件管理器机制 3、插件间通信 4、B站:Qt编程保姆级实战教程第七集插件 一些参考代码链接: git地址:https://github.com/keiler2018/QtPluginManagerTest 基于Qt插件实现的项目&#xff…

参考链接:
1、【QT】Qt Plugin开发
2、Qt 插件管理器机制
3、插件间通信
4、B站:Qt编程保姆级实战教程第七集插件

一些参考代码链接:
git地址:https://github.com/keiler2018/QtPluginManagerTest
基于Qt插件实现的项目:https://github.com/nitroshare/nitroshare-desktop
Qt 插件框架:https://gitee.com/penghongbin/QFrameWork

目录

    • 1、公共接口头文件
    • 2、插件dll开发
      • 2.1 新建插件dll工程(PluginDll_2工程)
      • 2.2、plugindll_2.h 代码部分调整
      • 2.4、插入一个自定义的窗口对象
      • 2.5、plugindll_2.cpp 代码部分调整
    • 3、主框架app开发
      • main.cpp文件
      • widget设计师类
    • 4、效果展示
      • 原始主程序
      • 点击加载插件按钮
      • 切换插件
      • 卸载插件

万事先问个为什么,为什么要学习QT插件开发?
QT插件开发很重要,可以实现代码解耦合,当一个界面程序功能模块很多的时候,如果都放在主程序编译会很耗时,代码量过多,维护困难;另外对于团队共同在一个工程里开发一个程序,会涉及到代码合并,每个开发者代码水平不一样,代码都写在一起,逐渐变成“屎山”等诸多问题。所以通过QT插件开发可以更好的分工和统一管理代码一致性,不同的人负责不同模块封装开发,本来这个博客在2024年12月份就开始写了,那时候各种测试也都通过了,后来一个事情打断了,所以导致这个事情一直搁置,现在捡起来是因为想对目前的程序重构,更换成界面+插件方式实现,至少目前还认为这个结构会更好,下面开干吧。

一个插件应该包含一个公共的接口头文件、插件DLL开发、主框架App开发

1、公共接口头文件

接口头文件会在主程序框架和插件中共同引用,其主要就是一个*.h的头文件

样例为:PluginInterface.h

#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H
#include <QWidget>
//接口里面都是纯虚函数,在插件动态库中要一个个具体实现,这里可以暴露自己需要的接口,这里样例只是调用出QWidget的插件窗口#define PluginInterfaceIID "com.xxx.JX/1.0.0"//定义接口iid: 组织机构域名 + 产品名 + 版本号
class PluginInterface
{
public:virtual ~PluginInterface()=default;virtual QWidget * genWidget()=0;
};//声明接口,与iid进行关联
Q_DECLARE_INTERFACE(PluginInterface,PluginInterfaceIID)#endif // PLUGININTERFACE_H

2、插件dll开发

2.1 新建插件dll工程(PluginDll_2工程)

选择Library
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、plugindll_2.h 代码部分调整

第一步将PluginInterface.h公共头文件拷贝到项目同级目录
第二步修改plugindll_2.h,主要修改:
1、include公共头文件PluginInterface.h,(重点)
2、修改继承,继承父类 QObject ,PluginInterface(重点)
3、新增类声明、接口声明、插件声明(重点)
4、重构所有接口文件中的方法(重点)
5、开发插件的QWidget,这里只是简单实现一下样例(插件功能部分)

原始代码

#ifndef PLUGINDLL_2_H
#define PLUGINDLL_2_H#include "PluginDll_2_global.h"class PLUGINDLL_2_EXPORT PluginDll_2
{
public:PluginDll_2();
};#endif // PLUGINDLL_2_H

修改后的代码

#ifndef PLUGINDLL_2_H
#define PLUGINDLL_2_H#include "PluginDll_2_global.h"
#include "PluginInterface.h"//1、引入插件公共头文件class PLUGINDLL_2_EXPORT PluginDll_2:public QObject,public PluginInterface//2、修改继承
{//3、类声明、接口声明、插件声明Q_OBJECTQ_PLUGIN_METADATA(IID PluginInterfaceIID)Q_INTERFACES(PluginInterface)public:PluginDll_2();~PluginDll_2();QWidget * genWidget() override;//4、重写接口文件中的方法,返回成员变量private:QWidget *m_MyWidget;//要弹出来的实际窗口};#endif // PLUGINDLL_2_H

2.4、插入一个自定义的窗口对象

这部分主要是为成员变量QWidget *m_MyWidget的实例化来做准备,也是插件开发的实际业务部分
插入一个QT设计师界面类,自定义类名:MyJX_Widget
在这里插入图片描述
在这里插入图片描述
为了简化区分,在Widget窗口中拖入一个按钮,做一个标识,这个插件就开发完了
在这里插入图片描述

2.5、plugindll_2.cpp 代码部分调整

在cpp中主要是new一个自定义窗口,用MyJX_Widget类实例化成员变量m_MyWidget,在调用接口方法的时候将m_MyWidget返回出去即可。

#include "plugindll_2.h"
#include "myjx_widget.h"PluginDll_2::PluginDll_2()
{this->m_MyWidget = Q_NULLPTR;//初始化
}PluginDll_2::~PluginDll_2()
{if(this->m_MyWidget){//释放this->m_MyWidget->deleteLater();}
}QWidget *PluginDll_2::genWidget()
{if(!this->m_MyWidget){this->m_MyWidget = new MyJX_Widget();//新建窗口对象,这里是实际业务窗口,继承了QWidget为父类}return this->m_MyWidget;
}

3、主框架app开发

主框架app程序包含加载插件和卸载插件两部分,当然如果有很多插件可以写一个界面进行管控插件加载位置,并对所有插件进行使用txt文件存储,需要的时候可以手工更改txt对应信息,可让插件加载到软件不同位置。
下面我这里主要讲解如何加载一个插件和卸载一个插件,有了这个思路,后面可以借助AI完成多个插件的集成开发;
项目中包含公共接口头文件(PluginInterface.h,前面列出了)、一个设计师类(widget.cpp、widget.h、widget.ui)、一个主程序入口(main.cpp)

main.cpp文件

主程序入口比较常规

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget设计师类

ui文件如下,主要为加载插件按钮、卸载按钮、一个QTabWidget窗口显示位置
在这里插入图片描述
widget.h文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPluginLoader>//插件引进类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void LoadSigPlugin(QPluginLoader& PluginLoad,QString PluginPath,QString TitleName);//加载一个指定插件,对插件加载位置进行控制private slots:void on_btn_LoadPlugin_clicked();//加载插件void on_btn_UnLoadPlugin_clicked();//卸载插件private:Ui::Widget *ui;QPluginLoader m_loader ;//插件对象,为了便于加载和卸载、写进成员变量
};
#endif // WIDGET_H

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include "PluginInterface.h"
#include <QDir>
#include <QMessageBox>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;if(m_loader.isLoaded()){m_loader.unload();//卸载插件}
}void Widget::LoadSigPlugin(QPluginLoader& PluginLoad,QString PluginPath,QString TitleName)
{//加载一个插件到ui->tabWidget对象中去if(PluginLoad.isLoaded()){//如果加载了,先卸载掉,否则多次点击加载插件按钮,则插件卸载会有异常PluginLoad.unload();//卸载插件}PluginLoad.setFileName(PluginPath);if(!PluginLoad.load()){//如果插件加载失败QMessageBox::critical(this,"",PluginLoad.errorString());//弹出不能加载的原因return;}//获取插件元数据QJsonObject metaData = PluginLoad.metaData();//获取元数据qDebug() << "Plugin metadata:" << metaData;//输出元数据信息PluginInterface * pi = qobject_cast<PluginInterface*>(PluginLoad.instance());//实例化插件if(pi){QWidget* w = pi->genWidget();if(w){this->ui->tabWidget->addTab(w,TitleName);}}}void Widget::on_btn_LoadPlugin_clicked()
{QDir dir(qApp->applicationDirPath());//程序执行文件夹QString PluginPath = dir.filePath("PluginDll_2.dll");
//    m_loader.setFileName(dir.filePath("PluginDll_2.dll"));LoadSigPlugin(m_loader,PluginPath,"TestDll2");//加载一个插件到软件中/*if(m_loader.isLoaded()){//如果加载了,先卸载掉m_loader.unload();//卸载插件}m_loader.setFileName(PluginPath);if(!m_loader.load()){//如果插件加载失败QMessageBox::critical(this,"",m_loader.errorString());//弹出不能加载的原因return;}//获取插件元数据QJsonObject metaData = m_loader.metaData();//获取元数据qDebug() << "Plugin metadata:" << metaData;//输出元数据信息PluginInterface * pi = qobject_cast<PluginInterface*>(m_loader.instance());//实例化插件if(pi){QWidget* w = pi->genWidget();if(w){ui->tabWidget->addTab(w,"hello plugin");}}
*/}void Widget::on_btn_UnLoadPlugin_clicked()
{if(m_loader.isLoaded()){m_loader.unload();//卸载插件}
}

4、效果展示

原始主程序

在这里插入图片描述

点击加载插件按钮

在这里插入图片描述

切换插件

在这里插入图片描述

卸载插件

在这里插入图片描述


文章转载自:

http://UeNjqLV9.zkdbx.cn
http://cpyEdTdA.zkdbx.cn
http://gJuNhwtB.zkdbx.cn
http://m8ZLXkCA.zkdbx.cn
http://RVRe4C1q.zkdbx.cn
http://LRX4jOI5.zkdbx.cn
http://HygZCkpj.zkdbx.cn
http://8tOD7MbC.zkdbx.cn
http://GjIrJzNk.zkdbx.cn
http://N1WDFmG4.zkdbx.cn
http://yneXpyLI.zkdbx.cn
http://XE78L0gd.zkdbx.cn
http://EPBUDlnY.zkdbx.cn
http://agSJgvX8.zkdbx.cn
http://QTFHismw.zkdbx.cn
http://phPFNOlT.zkdbx.cn
http://qhL11ZOr.zkdbx.cn
http://rZw7QavC.zkdbx.cn
http://oHRv1aoP.zkdbx.cn
http://XIVQX74Q.zkdbx.cn
http://ZcUWI4MQ.zkdbx.cn
http://6wHWN01r.zkdbx.cn
http://WzRDTdUc.zkdbx.cn
http://mEHXlzIj.zkdbx.cn
http://bEVaxdvd.zkdbx.cn
http://ARFMbr7h.zkdbx.cn
http://FUZN0j4I.zkdbx.cn
http://OJGnXwtt.zkdbx.cn
http://H6CAlKJa.zkdbx.cn
http://d2bKH4FS.zkdbx.cn
http://www.dtcms.com/wzjs/698345.html

相关文章:

  • 上海网站建设百家号模板免费的ppt软件
  • 长治市城乡建设局网站wordpress 主题 名站
  • 赤峰网站开发怎么做坑人网站
  • 商城网站建设方案 2017网站备案 网站建设方案书
  • 怎么免费搭建自己的网站wordpress 文章 版权
  • 好看的商城网站企业建设网站哪里好
  • wordpress换主题后seo一键优化
  • 天津做网站建设mssql网站开发
  • 银行门户网站是什么意思中国搜索引擎有哪些
  • 东莞响应式网站长沙棋牌软件开发公司
  • asp.net网站制作教程小程序制作视频
  • 免费做网站的方法入侵网站做排名
  • 用路由器做简单的网站郑州百度推广代运营公司
  • 网站推广公司新锐网站开发前端库
  • 网站 为什么要备案网站建设千套素材
  • 网站怎么推广官方传奇手游下载
  • 重庆智能网站建设设计兰州做门户网站
  • 制作一个网站需要多久环境建设公司网站
  • 企业怎样做网站南京seo优化推广
  • 网站负责人查询企业管理官网登录入口
  • 网站关键字优化软件顺德小程序开发公司
  • 高端网站建设青岛新零售六大模式
  • 如何创建自己公司的网站百度怎么建立自己的网站
  • 免费的行情网站app网页互联网站建设维护
  • 南京营销网站建设全屋定制自己设计
  • 电子商务网站的推广方式网站建设设计制作方案与价格
  • 网站页尾的作用用ps怎么做网站导航条怎么做
  • 建一个网站需要做什么的北京哪有建网站公司或个人的
  • 一个人做两个博客网站合肥哪家做网站好
  • 学网站建设培训机构合肥网站建设新浪营销