Qt plugin 开发UI界面插件

news/2024/5/3 13:03:37

目录

1.创建接口

2.创建插件

3.创建插件界面

4.插件实现

5.创建应用工程

6.应用插件


1.创建接口

打开QtCreater,点击左上角“文件”->新建文件或项目,在弹窗中选择C++/C++Header File。

输入文件名,选好路径(可自行设置名称,路径)。后面点击下一步,完成就可以了。

在创建的文件中输入以下内容

class MyPlugin : public QObject
{Q_OBJECT
public:virtual ~MyPlugin(){}virtual void msgToPlugin(int) = 0; //插件接收消息
signals:void msgFromPlugin(int);//插件发送消息
public:QWidget* widget; //插件界面接口指针
};
#define MyPlugin_IID "com.wyc.myplugin"
Q_DECLARE_INTERFACE(MyPlugin, MyPlugin_IID);//将接口告诉Qt元对象系统

2.创建插件

再次点击“文件”->新建文件或项目,选择Library/C++ Library,

输入名称和路径,其他没展示的,都选择默认,点下一步就可以了

添加上面生成的插件接口头文件

修改pro前几行

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTEMPLATE = lib
DEFINES += TEST_PLUGIN_UI_LIBRARY
CONFIG += plugin
CONFIG += c++11

3.创建插件界面

在test_plugin_ui项目上点击右键,选择Add new...,选择设计师界面类,输入名称。

界面中添加控件,用来测试和主界面的通讯。

头文件加入如下内容:

signals:void sendMsg(int);//发送消息
public slots:void recMsg(int); //接收消息
private slots:void on_send_clicked();

在cpp文件中实现相应的收发功能。

至此插件界面就做好了。

4.插件实现

在之前创建的test_plugin_ui.h中加入头文件:

#include "myplugin.h"
#include "pluginwidget.h"

在类中加入如下内容:

class TEST_PLUGIN_UI_EXPORT Test_plugin_ui : public MyPlugin
{Q_OBJECTQ_PLUGIN_METADATA(IID "com.wyc.myplugin")Q_INTERFACES(MyPlugin)
public:Test_plugin_ui();~Test_plugin_ui();void msgToPlugin(int); //接收消息
private:PluginWidget * m_pluginWidget = 0;
};

在cpp中初始化m_pluginWidget,并将其赋值给widget,外部界面可以通过widget指针使用插件里的界面.

m_pluginWidget = new PluginWidget;
widget = m_pluginWidget;
QObject::connect(m_pluginWidget, &PluginWidget::sendMsg, this, &Test_plugin_ui::msgFromPlugin);

实现函数void msgToPlugin(int)后,点击编译图标,即可生成.dll,.a文件

5.创建应用工程

创建应用工程

编译器一定要选跟上面一样的,其他都点“下一步”。

在ui文件中添加控件如下

右侧的布局用来添加插件界面。

6.应用插件

将上面生成的.dll和.a两个文件拷贝到相应的目录,比如Debug,就拷贝到build-...-Debug下,Release就拷贝到build-...-Release下。

将接口文件myplugin.h添加到工程中。

在头文件mainwindow.h中添加如下内容:

#include "myplugin.h"
public slots:void rectMsg(int value);
private slots:void on_sendBtn_clicked();
private:MyPlugin *m_plugin;

在mainwindow.cpp构造函数中添加如下内容:   

    if(!QLibrary::isLibrary(("test_plugin_ui.dll"))){qDebug()<<"not a library";return;}QDir dir("./test_plugin_ui.dll");qDebug()<<__LINE__ << dir.absolutePath();QPluginLoader loader(dir.absolutePath());loader.load();qDebug() << loader.errorString();m_plugin = qobject_cast<MyPlugin*>(loader.instance());if(m_plugin){ui->verticalLayout->addWidget(m_plugin->widget);connect(m_plugin, &MyPlugin::msgFromPlugin, this, &MainWindow::rectMsg);}else{qDebug()<<__LINE__ << "error";}

并在cpp文件中实现相应的收发功能,运行即可。


http://wed.xjx100/news/1296237.html

相关文章

ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例

ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例 文章目录 ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例一.Thinkphp5不安全的SQL写法二.Thinkphp3 SQL注入三.Thinkphp链5.1.x结合phar实现…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

蓝桥杯备考day2

1.1 map及其函数 map 提供一对一的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可 能在我们处理一对一数据的时候&#xff0c;在编程上提供快速通道。map 中的第一 个值称为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff0c;第二个称为该 关…

2024年华为OD机试真题-符号运算-Python-OD统一考试(C卷)

题目描述: 给定一个表达式,求其分数计算结果 表达式的限制如下: 1. 所有的输入数字皆为正整数(包括0) 2. 仅支持四则运算(+-*/)和括号 3. 结果为整数或分数, 分数必须化为最简格式(比如6, 3/4, 7/8, 90/7) 4. 除数可能为0,如果遇到这种情况,直接输出"ERROR" 5.…

vue实现海康h5player问题汇总

1. 引入问题 最开始写的时候&#xff0c;把h5player封装成了一个组件&#xff0c;把资源文件随便放在了一个目录下&#xff0c; 直接在子组件中引入&#xff0c;报错window.JSPlugin is not a constructor 或者JSPlugin is not defined 初步分析应该是引入资源文件失败&#x…

【学习】企业做等保测评有何意义

等保测评是指对信息系统的安全性进行评估和保障的一种标准&#xff0c;其全称为“信息安全等级保护测评”。随着信息技术的不断发展和应用&#xff0c;信息安全问题越来越受到人们的关注。为了保障信息系统的安全&#xff0c;国家制定了一系列的安全等级保护标准&#xff0c;而…

中信银行新一代数字化客服中心建设案例

“一体化”贯通全渠道 链接客户全旅程 中信银行新一代数字化客服中心建设案例 背景&#xff1a;客户需求变化&#xff0c;银行同质化面临考验 随着互联网和AI技术的蓬勃发展&#xff0c;客户的需求发生了很大的变化&#xff0c;对银行的服务需求已经从传统的线下渠道逐渐转…

怎么做预约小程序_探索我们的全新预约小程序

在繁忙的现代生活中&#xff0c;无论是想预约一次美容护理&#xff0c;还是预定一家心仪的餐厅&#xff0c;亦或是安排一次专业的咨询服务&#xff0c;我们都希望能够在最短的时间内完成这些操作&#xff0c;节省时间和精力。如今&#xff0c;一款全新的预约小程序应运而生&…