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

QT基础入门——信号和槽机制(二)

前言:

在Qt中,有一种回调技术的替代方法:那就是信号和机制。当特定事件发生时,会发出一个信号。Qt的小部件中有许多预定义的信号,但我们可以将小部件子类化,向它们添加自定义的信号。槽是响应特定信号的函数

一、QPushButton Class的创建

按钮控件头文件:#include<QPushButton>

#include "mywidget.h"
#include<QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent)
{//创建一个按钮QPushButton * btn = new QPushButton;//btn->show();//show以顶层方式弹出窗口控件//让btn对象  依赖在myWidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");}myWidget::~myWidget()
{
}

#include "mywidget.h"
#include<QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent)
{//创建第二个按钮,按照控件大小创建窗口QPushButton * btn2 = new QPushButton("第二个按钮",this);//移动btn2按钮btn2->move(100,100);//重置窗口大小resize(600,400);//设置固定窗口大小setFixedSize(600,400);//设置窗口标题setWindowTitle("窗口");
}myWidget::~myWidget()
{
}

 二、对象树

当创建的对象在堆区时候,如果指定的父亲是object派生下来的类或者.QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。一定程度上简化了内存回收机制
 

1.创建: 

 

 

2. mypushbutton.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H#include <QPushButton>class MyPushButton : public QPushButton
{Q_OBJECT
public:explicit MyPushButton(QWidget *parent = nullptr);~MyPushButton();
signals:};#endif // MYPUSHBUTTON_H

3. mypushbutton.cpp

#include "mypushbutton.h"
#include <QDebug>MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{qDebug() << "我的按钮类构造调用";
}MyPushButton ::~MyPushButton()
{qDebug() << "我的按钮类析构";
}

4.mywidget.cpp

#include "mywidget.h"
#include <QPushButton>
#include <mypushbutton.h>
#include <QDebug>myWidget::myWidget(QWidget *parent): QWidget(parent)
{//创建一个自己按钮的对象MyPushButton * myBtn = new MyPushButton;myBtn->setText("我自己的按钮");myBtn->move(200,0);myBtn->setParent(this); //设置到对象树中
}myWidget::~myWidget()
{qDebug() << "myWidget的析构调用";
}

5.运行结果 

三、QT坐标系 

坐标系:

以左上角为原点(0,0)X向右增加   Y向下增加

 其坐标相对于父窗口而言

*四.信号和槽

connect(信号的发送者,发送的具体信号,信号的接受者,信号的处理(槽))

信号槽的优点:

松散耦合﹐信号发送端和接受端本身是没有关联的,通过connect连接将两端耦合在一起

1.点击按钮关闭窗口

参数1   信号的发送者  

参数2   发送的信号(函数的地址)  

参数3   信号的接受者    

参数4   处理的槽函数(函数的地址)

#include "mywidget.h"
#include <QPushButton>
#include <mypushbutton.h>
#include <QDebug>myWidget::myWidget(QWidget *parent): QWidget(parent)
{//创建一个自己按钮的对象MyPushButton * myBtn = new MyPushButton;myBtn->setText("我自己的按钮");myBtn->move(200,0);myBtn->setParent(this); //设置到对象树中//需求   点击我的按钮关闭窗口//参数1  信号的发送者   参数2   发送的信号(函数的地址)   参数3   信号的接受者    参数4    处理的槽函数//connect(myBtn,&MyPushButton::clicked,this,&myWidget::close);connect(myBtn,&QPushButton::clicked,this,&QWidget::close);
}myWidget::~myWidget()
{qDebug() << "myWidget的析构调用";
}

2.自定义信号和槽

(1)自定义信号

        写到signals下

        返回void

        需要声明,不需要实现

        可以有参数,可以重载

(2)自定义槽函数

        返回void

        需要声明,也需要实现

        可以有参数,可以重载

        写到public slot下或者public或者全局函数。

(3)当定义信号和槽出现重载

        需要利用函数指针明确指向函数地址

    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;    void(Student:: *studentSlot)(QString) = &Student::treat;   connect(zt,teacherSignal,st,studentSlot);

        QsString ----》char *先转成OByteArray(.toUtf8())再转char *()

(4)信号连接信号

    无参信号和槽的连接  void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;  void(Student:: *studentSlot2)(void) = &Student::treat;    connect(zt,teacherSignal2,st,studentSlot2);   
信号连接信号    connect(btn,&QPushButton::clicked,zt,teacherSignal2);

(5)断开信号  

 disconnect(zt,teacherSignal2,st,studentSlot2);

 3.代码实现

(1)student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QWidget>class Student : public QWidget
{Q_OBJECT
public:explicit Student(QWidget *parent = nullptr);signals:public slots://早期qt版本   必须写到public slots,高版本可以写到public或者全局下//返回值 void,需要声明也需要实现//可以有参数,可以发生重载void treat();
};#endif // STUDENT_H

(2)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();};#endif // TEACHER_H

(3)widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <teacher.h>
#include <student.h>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;Teacher * zt;Student * st;void classIsOver();};
#endif // WIDGET_H

(4)student.cpp

#include "student.h"
#include <QDebug.h>
Student::Student(QWidget *parent) : QWidget(parent)
{}void Student::treat()
{qDebug()<<"请老师吃饭";}
void Student::treat(QString foodName)
{//QsString ----》char *先转成OByteArray(.toUtf8())再转char *()qDebug()<<"请老师吃饭,老师要吃"<<foodName.toUtf8().data();
}

(5)teacher.cpp

#include "teacher.h"Teacher::Teacher(QObject *parent) : QObject(parent)
{}

(6)widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>//Teacher 类  老师类
//Student 类  学生类
//场景:下课后老师触发一个信号,饿了,学生响应信号  请客吃饭Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->st = new Student(this);//    //老师饿了,学生请客的连接
//    connect(zt,&Teacher::hungry,st,&Student::treat);//    //调用下课函数
//    classIsOver();//连接带参数的信号和槽//指针---》地址//函数指针----》函数地址void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;void(Student:: *studentSlot)(QString) = &Student::treat;connect(zt,teacherSignal,st,studentSlot);//调用下课函数classIsOver();//点击一个  下课的按钮,再触发下课QPushButton * btn = new QPushButton("下课",this);//重置窗口大小this->resize(600,400);//点击按钮触发下课//connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);//无参信号和槽的连接void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;void(Student:: *studentSlot2)(void) = &Student::treat;connect(zt,teacherSignal2,st,studentSlot2);//信号连接信号connect(btn,&QPushButton::clicked,zt,teacherSignal2);//断开信号//disconnect(zt,teacherSignal2,st,studentSlot2);}void Widget::classIsOver()
{//下课函数调用后触发老师饿了的信号//emit zt->hungry();emit zt->hungry("鱼香肉丝");}
Widget::~Widget()
{delete ui;
}

4.Lambda表达式 

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

=  值传递

&  引用传递

()  参数     {}  实现体

mutable   修饰  值传递变量,可以修改拷贝出的数据,改变不了本体

返回值  []()  ->  int {}

最常用   [=](){}

    //利用Lambda表达式,实现点击按钮关闭窗口QPushButton *btn2 = new QPushButton;btn2->setText("关闭");btn2->move(100,0);btn2->setParent(this);connect(btn2,&QPushButton::clicked,this,[=](){
//       this->close();
//       emit zt->hungry("鱼香肉丝");btn2->setText("AAAAA");});

5.整体框架 

相关文章:

QT基础入门——信号和槽机制(二)

前言&#xff1a; 在Qt中&#xff0c;有一种回调技术的替代方法&#xff1a;那就是信号和槽机制。当特定事件发生时&#xff0c;会发出一个信号。Qt的小部件中有许多预定义的信号&#xff0c;但我们可以将小部件子类化&#xff0c;向它们添加自定义的信号。槽是响应特定信号的…...

黑豹程序员-架构师学习路线图-百科:JavaScript-网页三剑客

文章目录 1、为什么需要JavaScript2、发展历史3、什么是JavaScript3.1、JavaScript介绍3.2、JavaScript内部结构3.3、主要功能 4、TypeScript 1、为什么需要JavaScript 前面我们已经了解了网页三剑客的HTML和CSS&#xff0c;已经明确了它们的职责。 HTML负责页面的展现&#x…...

三、互联网技术——IP子网划分

文章目录 一、IP地址基础1.1 IP地址分类1.2 网络掩码/子网掩码 二、子网划分VLSM2.1 为什么要进行子网划分2.2 怎么进行子网划分2.3 子网划分原理2.4 例题一2.5 例题二2.6 例题三2.6 例题四2.7 例题五2.8 例题六2.9 例题七2.10 例题八 三、无类域间路由CIDR3.1 例题一3.2 例题二…...

TinyWebServer学习笔记-log

为什么服务器要有一个日志系统&#xff1f; 故障排查和调试&#xff1a; 在服务器运行期间&#xff0c;可能会发生各种问题和故障&#xff0c;例如程序崩溃、性能下降、异常请求等。日志记录了服务器的运行状态、错误信息和各种操作&#xff0c;这些日志可以用来快速定位和排查…...

【kubernetes】CRI OCI

1 OCI OCI(Open Container Initiative)&#xff1a;由Linux基金会主导&#xff0c;主要包含容器镜像规范和容器运行时规范&#xff1a; Image Specification(image-spec)Runtime Specification(runtime-spec)runC image-spec定义了镜像的格式&#xff0c;镜像的格式有以下几…...

竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…...

Youtube视频下载工具分享-油管视频,音乐,字幕下载方法汇总

YouTube视频下载方法简介 互联网上存在很多 YouTube 下载工具&#xff0c;但我们经常会发现自己收藏的工具没过多久就会失效&#xff0c;我们为大家整理的这几种方法&#xff0c;是存在时间较久并且亲测可用的。后续如果这些工具失效或者有更好的工具&#xff0c;我们也会分享…...

【算法练习Day11】滑动窗口最大值前 K 个高频元素

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 滑动窗口最大值前 K 个高频…...

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…...

GET 和 POST的区别

GET 和 POST 是 HTTP 请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中&#xff0c;POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求&#xff0c;或者已经看…...

机器学习(监督学习)笔记

目录 总览笔记内容线性回归梯度下降特征缩放多输出线性回归 逻辑回归二分类与逻辑回归分类任务的性能指标&#xff08;召回率&#xff0c;精度&#xff0c;F1分数等&#xff09;支持向量机SVMK近邻朴素贝叶斯分类器朴素贝叶斯分类器进阶多分类逻辑回归二分类神经网络多分类神经…...

科普rabbitmq,rocketmq,kafka三者的架构比较

对比 架构对比 从架构可以看出三者有些类似&#xff0c;但是在细节上有很多不同。下面我们就从它们的各个组件&#xff0c;介绍它们&#xff1a; RabbitMQ&#xff0c;是一种开源的消息队列中间件。下面是RabbitMQ中与其相关的几个概念&#xff1a; 1.生产者&#xff08;P…...

加密货币交易技巧——地利(二)

EMA指标 针对资金体量大的代币&#xff0c;做现货交易或低倍合约&#xff0c;可参考以下指标&#xff1a; 1.指标介绍&#xff1a;EMA&#xff0c;移动平均线指标&#xff0c;这里只分享中长线用法&#xff0c;非常实用且准确率超高 2.适用群体&#xff1a;适用于现货或低倍…...

服务网关Gateway_微服务中的应用

没有服务网关 问题&#xff1a; 地址太多安全性管理问题 为什么要使用服务网关 网关是微服务架构中不可或缺的部分。使用网关后&#xff0c;客户端和微服务之间的网络结构如下。 注意&#xff1a; 网关统一向外部系统&#xff08;如访问者、服务&#xff09;提供REST API。在Sp…...

2G大小的GPU对深度学习的加速效果如何?

训练数据情况 总共42776张224*224*3张图片 Found 42776 files belonging to 9 classes. Using 12833 files for training. 模型参数情况 Total params: 10,917,385 Trainable params: 10,860,745 Non-trainable params: 56,640 batch-size:12 GPU信息 NVIDIA GeForce GT 7…...

intel 一些偏门汇编指令总结

intel 汇编手册下载链接&#xff1a;https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html LDS指令&#xff1a; 手册中可以找到 位于 3-588 根据手册内容猜测&#xff1a;lds r16 m16:16 的作用&#xff0c;是把位于 [m16:16] 内存地址的数…...

python 多个proto文件import引用时出现ModuleNotFoundError错误

问题描述 my_proto文件夹里有两个proto文件&#xff0c;book.proto想要引用person.proto文件中的Person&#xff0c;如下 book.proto syntax "proto2";import "person.proto"; // 导入person.proto文件message Book {optional string name 1;optional …...

C语言图书管理系统

一、 系统概述 图书管理系统是一个用C语言编写的软件系统&#xff0c;旨在帮助图书馆或图书机构管理其图书馆藏书和读者信息。该系统提供了一套完整的功能&#xff0c;包括图书录入、借阅管理、归还管理、读者管理、图书查询、统计报表等。 二、 系统功能 2.1 图书录入 管理…...

归并排序及其非递归实现

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 归并排序递归实现 归并排序非递归实现 归并排序递归实现 图示&#xff1a; 代码&#xff1a; 先分再归并&#xff0c;像是后序一般。 //归并排序 void MergeSort(int* arr, int left, int right) {int* temp (int…...

【kubernetes】kubernetes中的Controller

1 什么是Controller&#xff1f; kubernetes采用了声明式API&#xff0c;与声明式API相对应的是命令式API&#xff1a; 声明式API&#xff1a;用户只需要告诉期望达到的结果&#xff0c;系统自动去完成用户的期望命令式API&#xff1a;用户需要关注过程&#xff0c;通过命令一…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...