自定义信号槽机制

news2024/11/13 12:11:51

自定义信号槽机制

  • 自定义信号
  • 自定义槽
  • 自定义信号和槽函数的使用
  • 解决办法

如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

  1. 要编写新的类并且让其继承Qt的某些标准类
  2. 这个新的子类必须从QObject类或者是QObject子类进行派生
  3. 在定义类的头文件中加入 Q_OBJECT 宏
// 在头文件派生类的时候,首先像下面那样引入Q_OBJECT宏:
class MyMainWindow : public QWidget
{
    Q_OBJECT
    ......
}

自定义信号

  1. 信号是类的成员函数
  2. 返回值必须是 void 类型
  3. 信号的名字可以根据实际情况进行指定
  4. 参数可以随意指定, 信号也支持重载
  5. 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
  6. 信号函数只需要声明, 不需要定义(没有函数体实现)
  7. 在程序中发射自定义信号: 发送信号的本质就是调用信号函数
  8. 习惯性在信号函数前加关键字: emit, 但是可以省略不写
  9. emit只是显示的声明一下信号要被发射了, 没有特殊含义
  10. 底层 emit == #define emit
// 举例: 信号重载
// Qt中的类想要使用信号槽机制必须要从QObject类派生(直接或间接派生都可以)
class Test : public QObject
{
    Q_OBJECT
signals:
    void testsignal();
	// 参数的作用是数据传递, 谁调用信号函数谁就指定实参
	// 实参最终会被传递给槽函数
    void testsignal(int a);
};

自定义槽

  1. 返回值必须是 void 类型

  2. 槽也是函数, 因此也支持重载

  3. 槽函数需要指定多少个参数, 需要看连接的信号的参数个数

  4. 槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数

  • 举例:
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a, double b);
  • 总结:
    槽函数的参数应该和对应的信号的参数个数, 从左到右类型依次对应
    信号的参数可以大于等于槽函数的参数个数 == 信号传递的数据被忽略了
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a);
  1. Qt中槽函数的类型是多样的
    Qt中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式(匿名函数)

  2. 槽函数可以使用关键字进行声明: slots (Qt5中slots可以省略不写)

  • public slots:
  • private slots: –> 这样的槽函数不能在类外部被调用
  • protected slots: –> 这样的槽函数不能在类外部被调用
// 槽函数书写格式举例
// 类中的这三个函数都可以作为槽函数来使用
class Test : public QObject
{
    public:
    void testSlot();
    static void testFunc();

    public slots:
    void testSlot(int id);
};

自定义信号和槽函数的使用

信号的参数主要是用于参数传递,传递到槽函数的参数里面去的。

先新建发射信号的类
在这里插入图片描述

在这里插入图片描述
继承QObject
(friend是关键字。。不能使用friend来命名类)
在这里插入图片描述
再新建一个接受信号的槽函数类:
在这里插入图片描述

信号类中定义的信号函数:
在这里插入图片描述
槽函数类中的槽函数声明:
在这里插入图片描述
槽函数定义:
在这里插入图片描述
将信号类和槽函数类在mainwindow中实例化。。并绑定
头文件中声明:
在这里插入图片描述
cpp中的定义
在这里插入图片描述

现在的关键问题是什么时候调用myFriend::sendMseeage信号函数,怎么调用myFriend::sendMseeage信号函数。

解决办法

在mainwindow中,在定义一个button按钮,发送信号,mainwindow接受信号,并调用myFriend::sendMseeage函数。

在这里插入图片描述

在这里插入图片描述
此时,button的click为信号函数,mainwindow中需要定义槽函数。

mainwindow代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "me.h"
#include "myfriend.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //定义信号类和槽函数类的指针
    myFriend* myfriend;
    me* tom;
//槽函数
public slots:
    void receivebutton();  //槽函数声明(需要定义)

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

定义:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    connect(ui->deleteWindow,&QPushButton::clicked,this,&MainWindow::close);
    //在mainwindow中将myfriend的信号函数和me的槽函数绑定 (关键在于自定义信号myFriend::sendMseeage的调用)
    myfriend = new myFriend(this);
    tom = new me(this);
    connect(myfriend,&myFriend::sendMseeage,tom,&me::receiveMessage);
    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);



}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::receivebutton()
{
    qDebug()<<"点击了一下";
    //调用信号函数&myFriend::sendMseeage (myFriend 指针得在头文件中定义,不让调用不了,尴尬。。)
    myfriend->sendMseeage();
}

做为button的槽函数(在槽函数中,调用myfriend的信号函数)
在这里插入图片描述

绑定:

    //再将button点击的信号函数和mainwindow中的receivebutton槽函数绑定
    connect(ui->sendMessage,&QPushButton::clicked,this,&MainWindow::receivebutton);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux上适用的反汇编调试软件(对标od)

ubuntu下类似于od软件 经过搜索&#xff0c;在Ubuntu上选用edb-debugger进行动态调试&#xff0c; 下载链接: https://github.com/eteran/edb-debugger 但是依赖反汇编引擎: https://github.com/capstone-engine/capstone 安装 先安装capstone 先下载release的版本&#xf…

有类型地址

有类型地址 子网号&#xff1a;基于网络号上划分。 A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E 类地址开头不同&#xff0c;是为了让网络不重叠。 A 类型 0 开头 网络号&#xff1a;8 位&#xff08;1 个字节&#xff09;。 主机号&#xff1a;24 位&#xff0…

windows环境下adb 下载和配置,连接手机。

ADB下载地址&#xff1a; https://adbdownload.com/ 选择下载windows系统的。 下载后解压&#xff0c;查看adb.exe所在的目录&#xff0c;如下 这里将路径复制下来&#xff1a;D:\ADB 配置到系统环境变量中。 然后再打开cmd&#xff0c;输入adb version查看版本。 出现…

Centos7.9 离线部署ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff09;。ChatG…

【stable diffusion】保姆级入门课程06-Stable diffusion(SD)图生图-上传蒙版及批量处理的用法

目录 0.本章素材 1.什么是上传蒙版 1.1.注意点 1.2.提示词部份 2.批量处理 3.涂鸦、局部重绘、涂鸦蒙版、上传蒙版 4.结语 0.本章素材 案例图链接&#xff1a;https://pan.quark.cn/s/3a64e682e311 案例图蒙版链接&#xff1a;https://pan.quark.cn/s/075f889af9c0 1.什…

了解Unity编辑器 之组件篇Effects(十一)

一、Halo&#xff1a;是一个可用于游戏对象的特效组件&#xff0c;它可以在对象周围添加一个光晕效果 Color属性: 用于设置Halo的颜色。你可以通过选择颜色面板中的颜色来指定光晕的外观。选择适当的颜色可以使光晕与游戏场景中的其他元素相匹配或突出显示。 Size属性: 用于设…

Kubernetes 之CNI 网络插件大对比

介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求&#xff0c;但在实现方面也具有一定的灵活性。因此&#xff0c;业界已有不少不同的网络方案&#xff0c;来满足特定的环境和要求。 CNI意为容器网络接…

华为数通HCIP-MPLS

传统ip转发 路由器根据流量的dip查找路由表进行转发&#xff1b; 缺陷&#xff1a;查找路由表需要消耗一定CPU开销&#xff1b;&#xff08;可以通过FIB表解决&#xff09; 安全性低&#xff0c;中间转发设备可以看到网络层ip信息&#xff1b; FIB(转发信息库&#xff09; 定…

Jmeter性能测试之正则表达式提取器

目录 前言 1. Jmeter正则表达式提取器 2. 入门实例 3. 进阶实例 前言 Jmeter正则表达式提取器属于Jmeter后置处理器&#xff08;post processors&#xff09;的一种&#xff0c;用于将取样器请求到的结果以正则表达式的方式读取出来。 1. Jmeter正则表达式提取器 1. 作用…

npm yarn nrm

npm 和 yarn npm和yarn都是包管理器&#xff0c;yarn是在2016年发布的&#xff0c;那时npm还处于V3时期&#xff0c;那时候还没有package-lock.json文件&#xff0c;不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽。此时&#xff0c;yarn 诞生了。yarn 的优点&#xff0c…

iMessage 开发要点 坑点记录

pod 添加iMessage后&#xff0c;建议podfile要这样&#xff1a; platform :ios, 14.0def commonPod//这里写一些主应用和iMessage都要依赖的库pod "YYKit", ~> 1.0.9 endtarget MainApp doframeworksuse_frameworks!inhibit_all_warnings!# 多Target都有的podco…

【Lua学习笔记】Lua进阶——Require,三目运算

文章目录 Require短路判断实现三目运算符 Require 这是文件aaa.lua的内容 aaa.lua: a 10 local b 20 print("我是aaa")这是文件example.lua的内容 example.lua: a 100 print(a) require("aaa") --require调用其他脚本文件 print(a) print(b) print(&…

亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用

亚马逊云科技近日在纽约峰会上宣布全面扩展其全托管基础模型服务Amazon Bedrock&#xff0c;包括新增Cohere作为基础模型供应商&#xff0c;加入Anthropic和Stability AI的最新基础模型&#xff0c;并发布变革性的新功能Amazon Bedrock Agents功能。客户无需管理任何基础设施&a…

ceph集群中RBD的性能测试、性能调优

文章目录 rados benchrbd bench-write测试工具Fio测试ceph rbd块设备的iops性能测试ceph rbd块设备的带宽测试ceph rbd块设备的延迟 性能调优 rados bench 参考&#xff1a;https://blog.csdn.net/Micha_Lu/article/details/126490260 rados bench为ceph自带的基准测试工具&am…

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…

【三维重建】SceneRF:基于NeRF的自监督单目三维场景重建

文章目录 摘要一、前言二、方法2.1.用于新的深度合成的NeRF3.1.1 深度估计 3.2 概率射线采样 (PrSamp)3.3 球形Unet&#xff08;SU-net&#xff09;3.4.场景重建方案 四、实验总结 摘要 从二维图像的三维重建被广泛的研究&#xff0c;训练与深度监督。为了放松对昂贵获取的数据…

火爆全网,Charles抓包教程-辅助接口测试(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 charles是一款非常…

【C++进阶】多态的理解

一.多态是什么 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为。 对于多态&#xff0c;不同的对象传过去&#xff0c;会调用不同的函数&#xff1b; 即多态调用看的是指向的对象。 //A&#xff0c;B类中的func函数是个多态 class A { pu…

自制Nuget包(C#)

自制Nuget包 自制C# Nuget包。 目的&#xff1a; 生成一个可以通过Nuget管理自动应用的包&#xff0c;生成效果如图&#xff1a; 步骤&#xff1a; 整个制作过程分为两步&#xff1a;第一步制作Nuget包&#xff0c;第二步上传Nuget包到Nuget网站&#xff08;地址&#xf…

Redis实战(2)——互斥命令用于构建分布式锁

1 什么是分布式锁 在单体应用中&#xff0c;线程锁是可以让多个线程串行执行一段代码逻辑的。不过在集群环境或者是分布式的环境下&#xff0c;线程锁无法保证线程串行运行&#xff0c;从而出现线程安全的问题。 根本的原因在于&#xff0c;在 集群分布式环境下 \textcolor{r…