Qt学习之旅 -信号与槽

news2025/7/9 8:55:17

文章目录

      • 点击关闭窗口
      • 自定义信号和槽
      • 自定义信号和槽解决重载问题
      • 信号和连接信号
      • 断开连接
      • Qt4版本信号槽连接
      • Lambda表达式

点击关闭窗口

connect(信号发送者,发送的具体信号,信号接收者,型号的处理(槽slot));

这里自定义的MyPushButtonQPushButton别无二至

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    resize(600,400);
    setWindowTitle("第一个窗口");
    setFixedSize(600,400);
    //创建一个按钮
    MyPushButton *myBtn = new MyPushButton;
    myBtn->setText("我自己的按钮");
    myBtn->setParent(this);
    myBtn->move(0,20);

    //需求: 点击我的按钮 关闭窗口
    connect(myBtn,&QPushButton::clicked, this,&Widget::close);
}

自定义信号和槽

在这里插入图片描述

//teacher.h
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    //自定义信号写到signals下
    //返回值是void 只需要申明,不需要实现
    //可以有参数,可以重载
    void hungry();

public slots:
};

#endif // TEACHER_H

//student.h
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:

public slots:
    //早期Qt版本 必须要写到public slots,高级版本可以写到public或者全局下
    //返回值void,需要声明,也需要实现
    //可以有参数,可以发生重载
    void treat(); //申明
};

#endif // STUDENT_H

#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat(){
  //实现
    qDebug() << "请老师吃饭";
}

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "teacher.h"
#include "student.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    Teacher *zt;
    Student *stu;

	void classIsOver();
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"



Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher(this);
    //创建一个学生对象
    this->stu = new Student(this);
    //老师触发一个信号:饿了;学生响应信号:请客吃饭
    connect(zt,&Teacher::hungry,stu,&Student::treat);
    //调用下课函数
    classIsOver();
}

void Widget::classIsOver(){
    //触发信号
    emit zt->hungry();
}

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

自定义信号和槽解决重载问题

//teacher.h
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    void hungry();
    void hungry(QString foodName); //添加

public slots:
};

#endif // TEACHER_H
//student.h
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);

signals:

public slots:
    void treat();
    void treat(QString foodName); //添加
};

#endif // STUDENT_H

//student.cpp(实现)
#include "student.h"
#include <QDebug>

Student::Student(QObject *parent) : QObject(parent)
{

}

void Student::treat(){
    qDebug() << "请老师吃饭";
}

void Student::treat(QString foodName){
    qDebug() << "请老师吃饭,老师要吃" << foodName;
}

#include "widget.h"
#include "ui_widget.h"



Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher(this);
    //创建一个学生对象
    this->stu = new Student(this);
    //连接带参数的信号和槽
    //指针 -> 地址
    //函数指针 -> 函数地址
    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个
    void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个
    connect(zt,teacherSignal,stu,studentSlot);
    //调用下课函数
    classIsOver();
}
void Widget::classIsOver(){
    //触发信号
    emit zt->hungry("红烧牛肉");
}

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

需要通过函数指针告诉它找哪块函数定义(有参还是无参)

在这里插入图片描述
这里不是有""引起了要吃的东西(就是"红烧牛肉")

//Student.cpp
void Student::treat(QString foodName){
    qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}

重点: 需要利用函数指针明确指向函数的地址void(类名:: *实例名)(QString/*形参*/) = 类名::重载函数名

  • QString转成char *
    • toUtf8()转为QByteArray;再使用data()转为char *

信号和连接信号

点击一个按钮触发自定义连接

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher(this);
    //创建一个学生对象
    this->stu = new Student(this);
    //连接带参数的信号和槽
    //指针 -> 地址
    //函数指针 -> 函数地址
    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个
    void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个
    connect(zt,teacherSignal,stu,studentSlot);
    //重置窗口大小
    this->resize(600,400);
    QPushButton *btn = new QPushButton("下课",this);
    //connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
	connect(btn,&QPushButton::clicked,zt,teacherSignal);

}

依旧是信号在调用槽函数

断开连接

//void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个
//void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个
//connect(zt,teacherSignal,stu,studentSlot);
disconnect(zt,teacherSignal,stu,studentSlot);//与连接参数一致

Qt4版本信号槽连接

connect(zt,SUGHAL(hungry),st,SLOT(treat()));

Lambda表达式

C++11中的Lambda表达式用于定义并创建匿名函数对象。以简化编程工作

在这里插入图片描述
格式

[](){}();
  • 空,没有使用任何函数对象参数。
  • =,函数体内可以使用Lambda所在作用域范围内所有的局部变量(包括Lambda所在的this)并且是引用传递方式(相当于编译器自动为我们按引用传递了所有的局部变量)
  • &,函数体内可以使用lambda所在作用返回内所有可见局部变量(包括lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)
  • this,函数体内可以使用lambda所在类中的成员变量
  • a,将a按值进行传递,按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数时const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  • &a,将a按引用进行传递。
  • a,&b:将a按值进行传递,b按引用进行传递
  • =,&a,&b出a和b按引用进行传递外,其他参数按照值进行传递
  • &,a,b出a和b按值传递外,其他参数都按引用进行传递。

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

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

相关文章

【NLP】KMP匹配算法

一、说明 KMP算法。也称为Knuth-Morris-Pratt字符串查找算法可在一个字符串S内查找一个词W的出现位置。一个词在不匹配时本身就包含足够的信息来确定下一个匹配可能的开始位置&#xff0c;此算法利用这一特性以避免重新检查先前配对的字符。将时间复杂度从O(M*N)降为O(N). 这个…

C++ Primer Plus 第三章习题

目录 复习题 1. 为什么C有多种整型&#xff1f; 2. 声明与下述描述相符的变量&#xff1f; 3. C 提供了什么措施来防止超出整型的范围&#xff1f; 4. 33L和33之间有什么区别&#xff1f; 5. 下面两条C语句是否等价&#xff1f; 6. 如何使用C来找出编码88表示的字符&…

又一个生物标志物ADMA被发现!可为OA治疗提供新方向!

文章标题&#xff1a;Metabolite asymmetric dimethylarginine (ADMA) functions as a destabilization enhancer of SOX9 mediated by DDAH1 in osteoarthriti 发表期刊&#xff1a;Science Advances 影响因子&#xff1a;14.95 作者单位&#xff1a;浙江大学医学院附属邵逸…

EasyUi03

1.无限极分类. 1.1无限极分类介绍. 1.1.1何为无限极分类. 无限极分类简单点说就是一个类别能够分多个子类&#xff0c;而后一个子类又能够分多个子类&#xff0c;就这样无限分下去&#xff0c;就好象 windows能够新建一个文件夹&#xff0c;而后在这个文件夹里又能够建一些文…

《嵌入式系统》知识总结12:SysTick定时器

SysTick定时器 系统时钟&#xff08;SysTick&#xff09; Corte-M3在内核中包含的简单定时器 • 该定时器的时钟源可以来自CM3内部时钟&#xff08;FCLK&#xff09;&#xff0c;或CM3外部时钟&#xff08;STCLK&#xff09; • 在STM32微控制器中&#xff0c;SysTick的时钟源可…

平板触控笔哪款好用?电容笔牌子排行

现如今&#xff0c;电容笔越来越受欢迎&#xff0c;不少人在记笔记、学画画甚至是玩游戏的时候都会使用它。最近看到很多人问&#xff0c;iPad电容笔哪款好用&#xff1f;针对这个问题&#xff0c;我来给大家推荐四款公认好用的平替电容笔&#xff0c;一起来看看吧。 一、主动…

实验篇(7.2) 08. 通过安全隧道访问内网服务器 (FortiClient-IPsec) ❀ 远程访问

【简介】通过对SSL VPN与IPsec VPN的对比&#xff0c;我们知道SSL VPN是基于应用层的VPN&#xff0c;而IPsec VPN是基于网络层的VPN&#xff0c;IPsec VPN对所有的IP应用均透明。我们看看怎么用FortiClient实现IPsec VPN远程访问。 实验要求与环境 OldMei集团深圳总部部署了一台…

眼底图片解读(对比图!!!)

目录 1. 前言 2.常见眼底解析 (1) 黄斑变性 (2) 糖尿病视网膜病变 (3) 青光眼 (4) 视网膜血管阻塞 (5)视网膜裂孔和脱离 1. 前言 眼底图像是通过眼底摄影等技术获取的眼底部位的影像&#xff0c;可以提供关于眼睛健康和疾病的重要信息。以下是眼底图像中常见的信息和相关…

只见新人笑,不见旧人哭 ChatGPT淘汰了多少产品?快来了解!

ChatGPT作为目前世界上最先进的人工智能聊天工具&#xff0c;其GPT模型就是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;使用多层变换器&#xff08;Transformer&#xff09;来预测下一个单词的概率分布&#xff0c;通过训练在大型文本语料库上学习到的语言模…

chatgpt赋能python:Python自动运行教程:让你的工作更智能化

Python自动运行教程&#xff1a;让你的工作更智能化 Python是一种高级、解释型、面向对象的编程语言&#xff0c;被广泛应用于数据分析、机器学习和自动化任务等领域。除此之外&#xff0c;Python还能够实现自动化运行&#xff0c;让用户无需手动干预&#xff0c;从而减轻工作…

Think系列产品进入BIOS的操作方法

Think系列产品进入BIOS的操作方法&#xff1a; 适用范围&#xff1a;ThinkPad全系列笔记本ThinkCentre全系列一体机ThinkStation全系列工作站 温馨提示&#xff1a;如果您用的是Win8/8.1系统&#xff0c;小乐强烈建议您在系统下执行“重启”后的开机界面(切记&#xff1a;不是从…

DynaMask:用于实例分割的动态掩码选择

文章目录 DynaMask: Dynamic Mask Selection for Instance Segmentation摘要本文方法Dual-Level FPNRegion-Level FPNFeature Aggregation Module (FAM)Mask Switch Module (MSM)损失函数 实验结果 DynaMask: Dynamic Mask Selection for Instance Segmentation 摘要 具有代表…

共见·价值成就|光环云与您相约2023亚马逊云科技合作伙伴峰会!

在云计算蓬勃发展的今天&#xff0c; 在推动业务发展、实现共赢的过程中&#xff0c; 价值成就&#xff0c;是亚马逊云科技对合作伙伴 自始至终的承诺。 为助力合作伙伴成就价值&#xff0c;共建成长路径&#xff0c; 2023亚马逊云科技合作伙伴峰会将于 6月27日在上海世博…

跟着LearnOpenGL学习7--坐标系统

文章目录 一、概述二、变换过程三、局部空间四、世界空间五、观察空间六、裁剪空间6.1、正射投影6.2、透视投影 七、组合变换八、3D实战8.1、创建模型矩阵8.2、创建观察矩阵8.3、创建投影矩阵8.4、变换矩阵传入着色器 九、3D立方体9.1、Z缓冲9.2、更多的立方体 一、概述 OpenG…

【022】C++的结构体、共用体以及枚举详解(最全讲解)

C的结构体、共用体以及枚举详解 引言一、结构体的概述二、结构体变量的操作2.1、结构体变量的初始化2.2、清空整个结构体变量2.3、键盘给结构体变量中的成员赋值2.4、单独操作结构体中的成员2.5、相同类型结构体变量之间的赋值 三、结构体嵌套结构体四、结构体数组五、结构体指…

JUC基础-0531

3 线程间通信 线程间通信的模型有两种:共享内存和消息传递&#xff0c;以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析 多线程编程步骤&#xff1a; 第一步&#xff1a;创建资源类&#xff0c;在资源类创建属性和操作方法第二步&#xff1a;在资源…

电脑录音软件哪个好用?如何录制声音?

案例&#xff1a;有没有好用的电脑录音软件分享&#xff1f; 【使用手机录制电脑上的声音&#xff0c;会录入外界的杂音&#xff0c;导致录音文件质量不佳。我需要一款支持录制电脑声音的软件&#xff0c;小伙伴们有没有好用的电脑录音软件推荐&#xff1f;】 电脑录音软件成…

docker安装RabbitMQ教程(2023年最详细)

1.使用docker查询rabbitmq的镜像 docker search rabbitmq 2.安装镜像 如果需要安装其他版本在rabbitmq后面跟上版本号即可 docker pull rabbitmq:3.7.7-management 说明 docker pull rabbitmq:版本号 -management 安装name为rabbitmq的这里是直接安装最新的 docker pull …

算法leetcode|54. 螺旋矩阵(rust重拳出击)

文章目录 54. 螺旋矩阵&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a;每次循环移动一步&#xff1a;每次循环完成一个顺时针&#xff1a…

玩转 GPT4All

目录 什么是Chatgpt 什么是gpt4all 如何使用 第一步&#xff1a;下载LLM模型 第二步&#xff1a;下载代码 第三步&#xff1a;将模型替换到 第四步&#xff1a;执行启动命令 第五步&#xff1a;生成自己的客户端 第六步&#xff1a;启动 第七步&#xff1a;配置UI 什么…