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基础入门——信号和槽机制(二)
前言: 在Qt中,有一种回调技术的替代方法:那就是信号和槽机制。当特定事件发生时,会发出一个信号。Qt的小部件中有许多预定义的信号,但我们可以将小部件子类化,向它们添加自定义的信号。槽是响应特定信号的…...
黑豹程序员-架构师学习路线图-百科:JavaScript-网页三剑客
文章目录 1、为什么需要JavaScript2、发展历史3、什么是JavaScript3.1、JavaScript介绍3.2、JavaScript内部结构3.3、主要功能 4、TypeScript 1、为什么需要JavaScript 前面我们已经了解了网页三剑客的HTML和CSS,已经明确了它们的职责。 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
为什么服务器要有一个日志系统? 故障排查和调试: 在服务器运行期间,可能会发生各种问题和故障,例如程序崩溃、性能下降、异常请求等。日志记录了服务器的运行状态、错误信息和各种操作,这些日志可以用来快速定位和排查…...
【kubernetes】CRI OCI
1 OCI OCI(Open Container Initiative):由Linux基金会主导,主要包含容器镜像规范和容器运行时规范: Image Specification(image-spec)Runtime Specification(runtime-spec)runC image-spec定义了镜像的格式,镜像的格式有以下几…...
竞赛 机器视觉opencv答题卡识别系统
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 答题卡识别系统 - opencv python 图像识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分…...
Youtube视频下载工具分享-油管视频,音乐,字幕下载方法汇总
YouTube视频下载方法简介 互联网上存在很多 YouTube 下载工具,但我们经常会发现自己收藏的工具没过多久就会失效,我们为大家整理的这几种方法,是存在时间较久并且亲测可用的。后续如果这些工具失效或者有更好的工具,我们也会分享…...
【算法练习Day11】滑动窗口最大值前 K 个高频元素
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 滑动窗口最大值前 K 个高频…...
华为云HECS云服务器docker环境下安装nginx
前提:有一台华为云服务器。 华为云HECS云服务器,安装docker环境,查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…...
GET 和 POST的区别
GET 和 POST 是 HTTP 请求的两种基本方法,要说它们的区别,接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求,或者已经看…...
机器学习(监督学习)笔记
目录 总览笔记内容线性回归梯度下降特征缩放多输出线性回归 逻辑回归二分类与逻辑回归分类任务的性能指标(召回率,精度,F1分数等)支持向量机SVMK近邻朴素贝叶斯分类器朴素贝叶斯分类器进阶多分类逻辑回归二分类神经网络多分类神经…...
科普rabbitmq,rocketmq,kafka三者的架构比较
对比 架构对比 从架构可以看出三者有些类似,但是在细节上有很多不同。下面我们就从它们的各个组件,介绍它们: RabbitMQ,是一种开源的消息队列中间件。下面是RabbitMQ中与其相关的几个概念: 1.生产者(P…...
加密货币交易技巧——地利(二)
EMA指标 针对资金体量大的代币,做现货交易或低倍合约,可参考以下指标: 1.指标介绍:EMA,移动平均线指标,这里只分享中长线用法,非常实用且准确率超高 2.适用群体:适用于现货或低倍…...
服务网关Gateway_微服务中的应用
没有服务网关 问题: 地址太多安全性管理问题 为什么要使用服务网关 网关是微服务架构中不可或缺的部分。使用网关后,客户端和微服务之间的网络结构如下。 注意: 网关统一向外部系统(如访问者、服务)提供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 汇编手册下载链接:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html LDS指令: 手册中可以找到 位于 3-588 根据手册内容猜测:lds r16 m16:16 的作用,是把位于 [m16:16] 内存地址的数…...
python 多个proto文件import引用时出现ModuleNotFoundError错误
问题描述 my_proto文件夹里有两个proto文件,book.proto想要引用person.proto文件中的Person,如下 book.proto syntax "proto2";import "person.proto"; // 导入person.proto文件message Book {optional string name 1;optional …...
C语言图书管理系统
一、 系统概述 图书管理系统是一个用C语言编写的软件系统,旨在帮助图书馆或图书机构管理其图书馆藏书和读者信息。该系统提供了一套完整的功能,包括图书录入、借阅管理、归还管理、读者管理、图书查询、统计报表等。 二、 系统功能 2.1 图书录入 管理…...
归并排序及其非递归实现
个人主页:Lei宝啊 愿所有美好如期而遇 目录 归并排序递归实现 归并排序非递归实现 归并排序递归实现 图示: 代码: 先分再归并,像是后序一般。 //归并排序 void MergeSort(int* arr, int left, int right) {int* temp (int…...
【kubernetes】kubernetes中的Controller
1 什么是Controller? kubernetes采用了声明式API,与声明式API相对应的是命令式API: 声明式API:用户只需要告诉期望达到的结果,系统自动去完成用户的期望命令式API:用户需要关注过程,通过命令一…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
