Qt plugin 开发UI界面插件

目录

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 += widgets

TEMPLATE = 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_OBJECT
    Q_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文件中实现相应的收发功能,运行即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 开发-二级联动

介绍 本示例主要介绍了List组件实现二级联动&#xff08;Cascading List&#xff09;的场景。 该场景多用于短视频中拍摄风格的选择、照片编辑时的场景的选择。 效果图预览 使用说明&#xff1a; 滑动二级列表侧控件&#xff0c;一级列表随之滚动。点击一级列表&#xff0c;…

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

【单片机】74HC4052电路图,单片机端口复用电路

74HC4052电路图 如下图&#xff0c;还是很好理解&#xff0c;PA9、PA10是单片机引脚。 当A和B是00&#xff0c;那么就是X-COM和0X短路&#xff0c;Y-COM和0Y短路。 当A和B是01&#xff0c;那么就是X-COM和1X短路&#xff0c;Y-COM和1Y短路。 以此类推。 74HC 工艺可以直接3.…

网传桌面版telegram RCE 0day

网传根据区块链安全公司CertiK发布的一份新报告&#xff0c;CertiK 发现Telegram桌面版的处理媒体文件过程&#xff0c;可能存在RCE漏洞。此漏洞会使用户面临特制媒体文件&#xff08;例如图像或视频&#xff09;的恶意攻击。 CertiK Alert 于 4 月 9 日在社交媒体平台 X 上警…

冯喜运:4.10周三外汇现货黄金原油走势分析及操作建议

黄金走势分析&#xff1a;黄金目前的波动已经基本没有什么技术面可言了&#xff0c;现在主要就是重点看市场消息面影响所造成的砸盘力度情况&#xff0c;但当下不管是战争因素所带来的避险情绪影响还是美国降息与否所带来的经济影响都无疑还是支撑着黄金继续走高&#xff0c;那…

使用labelImg标注数据集

1 Labelimg下载 Labelimg下载地址http:// https://github.com/tzutalin/labelImg下载得到的压缩包解压 建议使用Anaconda安装 使用管理员运行Anaconda Prompt,激活虚拟环境,在labelImg-master目录下执行命令 conda install pyqt=5 pyrcc5 -o libs/resources.py resources…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

高效实现红黑树范围查询:RB-ENUMERATE操作的设计与分析

高效实现红黑树范围查询&#xff1a;RB-ENUMERATE操作的设计与分析 一、RB-ENUMERATE操作的需求分析二、RB-ENUMERATE操作的设计思路三、RB-ENUMERATE操作的具体实现四、性能分析五、结论 在红黑树的广泛应用中&#xff0c;我们经常需要对树中的元素进行查询和操作。除了基本的…

gr::log :INFO: packet_headerparser_b0 - Detected an invalid packet at item问题记录

文章目录 前言一、OFDM 帧结构设计二、源码修改三、运行结果前言 在使用 GNU Radio 对 OFDM 进行帧结构设计时,出现了如下的警告信息: gr::log :INFO: packet_headerparser_b0 - Detected an invalid packet at item 724224 gr::log :INFO: header_payload_demux0 - Parser …

【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关

往期回顾 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QChe…

多线程原理详解01(程序、进程、线程介绍,线程创建的三种方式(Thread、Runnable、Callable)、三种方式各自实现多线程的具体操作、代码解析)

目录 多线程原理详解01_线程简介多任务多线程程序、进程、线程Process&#xff08;进程&#xff09;与 Thread &#xff08;线程&#xff09;总结&#xff1a; 02_线程创建三种方式&#xff1a;1、继承 Thread 类1-1&#xff1a;通过继承Thread类实现多线程演示代码 1-2&#x…

【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

文章目录 Leetcode 235. 二叉搜索树的最近公共祖先解题思路代码总结 Leetcode 701. 二叉搜索树中的插入操作解题思路代码总结 Leetcode 450. 删除二叉搜索树中的节点解题思路代码总结 草稿图网站 java的Deque Leetcode 235. 二叉搜索树的最近公共祖先 题目&#xff1a;235. 二…

代码随想录第36天 | 435. 无重叠区间 、 763.划分字母区间 、 56. 合并区间

一、前言&#xff1a; 参考文献&#xff1a;代码随想录 今天的主题是贪心算法中的重叠区间&#xff0c;就像昨天的扎气球问题&#xff0c;就是通过排序&#xff0c;然后将区间重叠起来&#xff0c;然后更具边界值判断这个区间是否重叠。 二、无重叠区间 1、思路&#xff1a…

异常处理过程和范例

目录 异常定义 异常关联 异常捕获与处理 查询 emp 数据表中工作岗位是 MANAGER 的员工信息&#xff0c;如果不存在这个员工&#xff0c;则输出“没有数据记录返回”&#xff0c;如果存在多个记录&#xff0c;则输出“返回数据记录超过一行” 更新数据表 emp 中部门编号&am…

产品推荐 | iWave 的 FPGA-IP 评估附加 FMC 卡

1、产品概述 iWave 的 FPGA-IP 评估附加 FMC 卡旨在满足 ANSI/VITA 57.1 FMC 标准。该卡支持高引脚数 &#xff08;HPC&#xff09; 和低引脚数 &#xff08;LPC&#xff09; 连接器&#xff0c;可在风冷环境中使用。FPGA-IP评估附加卡可以与市场上的大多数FPGA开发套件连接。…

LeetCode 994—— 腐烂的橘子

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 1.记录下初始新鲜橘子的位置到 notRotting&#xff0c;我们按照行把二维数组拉成一维&#xff0c;所以&#xff0c;一个vector 就可以实现了&#xff1b;2.如果没有新鲜橘子&#xff0c;那么第 0 分钟所有橘子已经…

44-技术演进(下):软件架构和应用生命周期技术演进之路

应用、系统资源、应用生命周期管理这 3 个维度&#xff0c;构成了我们对云的所有诉求。 我会介绍下应用维度和应用生命周期管理维度的技术演进。 我们就先来看下软件架构的演进之路。 软件架构的演进 软件架构技术演进如下图所示&#xff1a; 单体架构 在单体架构中&#xff…

浅聊java集合框架中的java.util.LinkedList

java集合框架总览 Java集合框架是一个用来代表和操纵集合的统一架构&#xff0c;它为管理和组织对象的集合提供了一组类和接口。这个框架包含三个主要部分&#xff1a;接口、实现和算法。 接口&#xff1a; Collection&#xff1a;这是集合框架的根接口&#xff0c;定义了集…

vue 上传视频

controlslist 属性可以用于告诉浏览器在视频播放过程中应该显示哪些默认的用户界面控件 代码&#xff1a; <template><div class"schematicDiagramIndex"><el-container><el-header v-if"this.radiooCar1"><el-button click&qu…

【精选】发布应用到应用商店的基本介绍

摘要 本文旨在介绍如何在各大应用商店发布应用&#xff0c;包括市场选择、准备材料、上架步骤以及常见被拒原因及解决方法。通过详细的步骤和经验分享&#xff0c;帮助开发者顺利将应用推向市场。 引言 随着移动应用市场的不断发展&#xff0c;越来越多的开发者希望将他们的…