QT的核心——信号与槽
目录
回顾C 语言信号
1、信号与槽
2、关联信号与槽
2.1自动关联信号与槽
2.2手动关联信号与槽
2.3断开信号与槽
3、自定义信号
3.1自定义信号使用条件
3.2自定义槽函数使用条件
4、信号与槽参数传递
4.1自定义一个带参的信号
4.2关联带参的信号与槽
4.3发送一个带参的信号
5、信号与槽的相互关联
6、lambda表达式
lambda 表达式的应用
7、lambda 与 信号和槽
回顾C 语言信号
signal(设置信号处理方式)功能:注册一个信号处理函数,当收到该信号后,就会触发handler 函数表头文件 #include<signal.h>定义函数 void *signal(int signum,void(* handler)(int));signum : 需要捕捉的信号。handler : 收到信号后执行的函数
1.捕捉的信号能自定义吗? 不可以,只能使用系统预定义好的信号
2.信号可以传输数据吗? 不可以,信号只负责通知
所以QT 在 C 语言的信号基础进行封装,把上述两个问题都解决了。 在QT 中用户可以自定义信号, 在QT 中用户可以通过信号与槽传递参数。
信号:各种事件
槽: 响应信号的动作
1、信号与槽
当某个事件发生后,如某个按钮被点击了一下,它就会发出一个被点击的信号(signal)。
某个对象接收到这个信号之后,就会做一些相关的处理动作(称为槽slot)。
但是Qt对象不会无故收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect)
//QT的四个信号
- pressed():鼠标按下时触发。对应的函数是 mousePressEvent()。
- clicked():鼠标松开时触发。如果鼠标拖拽到按钮区域之外释放则不会触发。对应的函数是 mouseReleaseEvent()。一般情况下 connect 槽函数时使用该信号。
- released():鼠标松开时触发。即使鼠标拖拽到按钮区域之外释放也会触发。对应的函数是 mouseReleaseEvent()。
- toggled():设置 setCheckable(true) 后再单击按钮才会触发该信号。一般用于多个按钮组成 QButtonGroup 并且 setExclusive(true) 设置按钮间互斥。 正常情况下单击按钮,响应顺序为:pressed() — about 215ms — released() — almost 0ms — clicked()。
2、关联信号与槽
关联的方法有两种:自动关联,手动关联。下面对此进行一次次介绍
2.1自动关联信号与槽
在项目 增加信号和槽的方法一:在UI设计师中增加
第一步:右击控件,在弹出的对话框,
在下拉列表中,选择"转到槽",会弹出选择对话框
第二步:选择自己信号
会自动生成槽函数(.h和.cpp)
第三步:当点击相应的控件时,对应的槽函数就会被调用,从面是实现动态交互的效果
槽函数
2.2手动关联信号与槽
QMetaObject::Connection QObject::connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection
);
其中,sender 表示信号发送者,signal 表示信号名,receiver 表示信号接收者,method 表示槽函数名,type 表示连接类型
type参数的值 | 描述 | 解释 |
Qt::DirectConnection | 直接连接 | 即在信号发出时直接调用槽函数,槽函数会立即执行,而不管当前的线程是否与信号发出者在同一个线程 |
Qt::QueuedConnection | 排队连接 | 将信号事件放入接收对象的事件队列中,槽函数会在事件循环处理时被执行,适用于跨线程的连接 |
Qt::BlockingQueuedConnection | 阻塞排队连接 | 槽函数会在接收对象的线程中执行,并且当前线程会阻塞,直到槽函数执行完成 |
Qt::AutoConnection | 自动连接 | 如果信号发送者和接收者在同一个线程,使用直接连接,否则使用排队连接 |
Qt::UniqueConnection | 唯一连接 | 已经存在相同的连接,则不会创建新的连接,可以避免重复连接导致的问题,如重复执行槽函数等 |
在QT4和QT5中,手动关联有着意义重大的调整,QT4不会检查信号与槽的参数是否匹配,而QT5会自动检查信号与槽的参数是否匹配。
下面给出QT4和QT5的关联例子:
QT4:
//手动关联信号与槽 this 表示的是当前窗体,MainWindow
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
QT5:
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::show_msg);
2.3断开信号与槽
语法:
语法: QT4: disconnect(信号发送者地址,SIGNAL(信号名(参数列表)),信号接收者地址,SLOT(槽名称(参数列表)));
QT5: disconnect(信号发送者地址,&发送者类名::信号名,信号接收者地址,&接受者类名::槽名称);
void MainWindow::on_pushButton_2_clicked()
{//取消信号与槽的关联 QT4// disconnect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));//取消信号与槽的关联 QT5disconnect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::on_pushButton_clicked);//因为自动关联,QT软件采用的是QT4的语法关联,所以取消只能用QT4 。//关联时使用了那种方法,取消时要一致!!qDebug() << "取消关联";
}
注意:使用自动关联的时候,QT软件采用的是QT4的语法关联,所以取消关联只能用QT4;使用手动关联的时候,关联时使用了那种方法,取消时要一致
3、自定义信号
在QT中,信号是可以自定义的,语法如下:
//在xxx.h头文件中 声明信号
signals: void 信号名(参数列表);
注意:信号只需要声明不需要定义!!!
但是可以看到定义信号的时候可以参数,参数的类型在信号定义的时候必须已经确定,而且不能改变,信号默认只能传递基本的类型如下(列举部分):
int:整数类型
double:双精度浮点数类型
QString:字符串类型
QDate:日期类型
QTime:时间类型
QColor:颜色类型
在C++中,参数支持默认参数,那么在QT的信号定义时,当然也可以为参数设置默认值。
定义完自定义信号之后,需要代码来控制发送信号,发送语法如下:
//使用 emit 信号名(参数列表); 发送信号
emit mysig(); //发送一个mysig信号
在发出信号时,如果没有指定参数,则使用默认值。
自定义信号与槽的关联和上面的关联是类似的:
//信号在那个类中定义的,该类就是发送者connect(this,SIGNAL(mysig()),this,SLOT(getsig()));//发送信号emit mysig();//温馨提示:信号的发送必须在"关联后"发送,否则该信号失效
3.1自定义信号使用条件
- 声明在类的signals域下
- 没有返回值,void类型的函数
- 只有函数声明,没有定义
- 可以有参数,可以重载
- 通过emit关键字来触发信号,形式:emit object->sig(参数);
3.2自定义槽函数使用条件
- qt4 必须声明在 private/public/protected slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式
- 没有返回值,void类型的函数
- 不仅有声明,还得要有实现
- 可以有参数,可以重载
4、信号与槽参数传递
4.1自定义一个带参的信号
#ifndef MAINWINDOW_H
#define MAINWINDOW_Hclass MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();//自定义一个带参的信号
signals:void mysig(int a);//注意:信号与槽的参数类型必须匹配!!
//声明一个带参的槽函数
public slots: void getsig(int a); private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
4.2关联带参的信号与槽
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//关联带参的信号与槽,信号与槽的参数都需要在关联是列举出来 connect(this,SIGNAL(mysig(int)),this,SLOT(getsig(int)));
}MainWindow::~MainWindow()
{delete ui;
}
4.3发送一个带参的信号
emit mysig(10010);
注意事项:
- 信号参数的类型必须要与槽函数的类型匹配 参数类型不匹配会发生报错: MainWindow::mysig(QString) --> MainWindow::myslot(int)
- 信号参数的个数必须大于槽函数参数的个数(理解:能少接受发来的信号,不能多接受发来的信号) 槽参数的个数大于信号参数个数 : MainWindow::mysig(int) --> MainWindow::myslot(int,int,int)
5、信号与槽的相互关联
6、lambda表达式
- capture 子句(在 C++ 规范中也称为 Lambda 引导。)
- 参数列表(可选)。 (也称为 Lambda 声明符)
- mutable 规范(可选)。
- 异常规范(可选)。
- 后面的-返回值-类型(可选)。
- Lambda 体。
语法:
auto func = [capture] (params) opt -> ret { func_body; };func是可以当作lambda表达式的名字,作为一个函数使用
capture是捕获列表
params是参数表
opt是函数选项(mutable之类)
ret是返回值类型
func_body是函数体。 capture是捕获列表:
[]不捕获任何变量
[&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用,可以修改值
[=]值捕获,捕获外部作用域所有变量,在函数内内有个副本使用 ,不可以修改值
[=, &a]值捕获外部作用域所有变量,按引用捕获a变量
[a]只值捕获a变量,不捕获其它变量
[this]捕获当前类中的this指针opt选择:
int a = 0;
auto f1 = [=](){ return a; }; // 值捕获a
cout << f1() << endl;
auto f2 = [=]() { return a++; }; // 修改按值捕获的外部变量,error
auto f3 = [=]() mutable { return a++; }; //添加mutable 选项可以修改
lambda 表达式的应用
#include <iostream>
#include <list>
using namespace std;int main() {list<int> vec;vec.push_back(10);vec.push_back(45);vec.push_back(4);vec.push_back(48);vec.sort(); for(int i:vec){cout << i << endl;}//自定义排序的规则 vec.sort([](int a,int b){return a>b;});for(int i:vec){cout << i << endl;}
}
基础写法
数据捕获问题
7、lambda 与 信号和槽
QT 中的一些简单功能的槽函数可以直接设计为 lambda 表达式,这样就不用在头文件声明槽,在源文件定义槽。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{ui->setupUi(this);//手动关联信号与槽 , 去头文件声明 myslot ,再定义 myslot 很麻烦//connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::myslot);//把槽函数修改为 lambda表达式connect(ui->pushButton,&QPushButton::clicked,this,[](){qDebug() << "按钮点击";});}
相关文章:
QT的核心——信号与槽
目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带…...
【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化
1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问层。 单体架构只适合在应用初期,且访问量比较下的情况下使用,优点是性价比很…...
MyCAT命令行监控
9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…...
【python】正则表达式匹配数据
前言 使用正则表达式处理数据,可进行字符串匹配、提取和替换等操作。在python中,通过re库完成正则匹配的操作。 一、正则语法规则 1.常用匹配符 模式描述^匹配字符串开头$匹配字符串结尾.匹配任意字符*匹配前面的字符零次或多次匹配前面的字符一次或多…...
【C++】用Windows API在控制台实现选择选项
2023年8月23日,周三上午 今天上午花了一个小时来实现这个 这个程序在碰到边界时会发出声音, 通过调用Windows API的Beep函数来实现。 #include<Windows.h> #include<conio.h> #include<iostream> #include<cstdlib>const int …...
Golang 批量执行/并发执行
提到Golang,都说Golang 天生高并发。所以分享一下我认为的Golang高并发精髓 简单的并发执行util package util import ("context""sync" )type batchRunner struct {BatchSize intctx context.Contextchannel chan func()wg sy…...
使用go语言、Python脚本搭建一个简单的chatgpt服务网站。
使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己,自学了go语言编程和机器学习相关学习,但是一味学习理论,终究是枯燥的,于是自己弄点小项目做。 在这之前,建议您需要掌握以下两个技…...
基于java会议室预约系统设计与实现
摘要 一个企业的发展离不开相关的规定流程。信息化到来的今天在我们的生活当中。离不开各种信息化的支持。比如钉钉会议预约、美团买菜、扫码签到等各种信息化软件。他们涉及我们生活中的方方面面给我们的生活提供了更大的便利性。大到政府、企业办公小到人们的衣食住行都离不开…...
Ubuntu18.04 交叉编译curl-7.61.0
下载 官方网址是:curl 安装依赖库 如果需要curl支持https协议,需要先交叉编译 openssl,编译流程如下: Ubuntu18.04 交叉编译openssl-1.1.1_我是谁??的博客-CSDN博客 解压 # 解压: $tar -xzvf curl-7.61.…...
Android相机-HAL子系统
引言 应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求,并且提交请求是非阻塞的,始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息&…...
PostgreSQL-研究学习-介绍与安装
PostgreSQL-预研 是个很厉害的数据库的样子 ψ(*`ー)ψ 官方文档:http://www.postgres.cn/docs/12/ 总的结论和备注 PgSQL 支持对JSON的支持很强大,以及提供了很多数学几何相关的数据类型【例:点,线条,几何…...
【Unity细节】Unity制作汽车时,为什么汽车会被弹飞?为什么汽车会一直抖动?
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶🌫️收录于专栏:unity细节和bug 😶🌫️优质专栏 ⭐【…...
Android初学之android studio运行java/kotlin程序
第一步骤:File—>New—>New Module,然后弹出一个框,(左边)选择Java or Kotlin Library,(右边)编辑自己的图书馆名、包名、类名,选择Java一个语言,然后F…...
使用自定义 C ++类扩展 TorchScript
使用自定义 C 类扩展 TorchScript 本教程是自定义运算符教程的后续教程,并介绍了我们为将 C 类同时绑定到 TorchScript 和 Python 而构建的 API。 该 API 与 pybind11 非常相似,如果您熟悉该系统,则大多数概念都将转移过来。 在 C 中实现和…...
UITableView自定义TableHeader和TableFooter
UITableView自定义TableHeader和TableFooter 我猜你希望的效果是这样的 我猜你希望的效果是这样的 自定义页眉视图 让我们创建一个文件名 UITableViewHeaderFooterView 的 CustomerHeaderView 子类。 现在让我们创建视图的 Xib 文件并将其命名为 CustomHeaderView。 更改高度标…...
【TA 挖坑03】雾效 | 透光材质 | Impostor | 厚度转球谐
仍旧是记录下半年想要做的东西,很有趣,实现“一团雾效” “面片也有立体感” 等等效果的一些技术上的方法。 仅粗浅记录,保证之后自己填坑的时候看得懂就行! 透光 -> 透光材质ShadingModel 《永劫无间》透光材质的渲染&…...
案例-基于MVC和三层架构实现商品表的增删改查
文章目录 0. 项目介绍1. 环境准备2. 查看所有2.1 编写BrandMapper接口2.2 编写服务类,创建BrandService,用于调用该方法2.5 编写Servlet2.4 编写brand.jsp页面2.5 测试 3.添加3.1 编写BrandMapper接口 添加方法3.2 编写服务3.3 改写Brand.jsp页面&#x…...
Java——一个简单的计算器程序
该代码是一个简单的计算器程序,使用了Java的图形化界面库Swing。具体分析如下: 导入必要的类和包: import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects; import javax.…...
自定义滑动到底部触发指令,elementUI实现分页下拉框
在 main.js 中添加 // 自定义滑动到底部指令 Vue.directive(selectLoadMore, {bind(el, binding) {// 获取element-ui定义好的scroll盒子const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap)SELECTWRAP_DOM.addEventListener(scroll, fun…...
【Windows 常用工具系列 10 -- linux ssh登录脚本输入密码】
文章目录 脚本输入SSH登录密码scp 脚本免密传输 脚本输入SSH登录密码 sshpass 是一个用于运行时非交互式ssh密码提供的工具,它允许你直接在命令行中为ssh命令提供密码。这就意味着你可以在脚本中使用ssh命令,而不需要用户交互地输入密码。 一般来说&am…...
C#的索引器
索引器 在 C# 中,索引器(Indexer)是一种特殊的属性,允许通过类的实例像访问数组一样访问对象的元素。索引器允许将类的实例作为集合来使用,可以按照自定义的方式访问类中的元素。 索引器的定义类似于属性,…...
软件配置安装(破解)--- maven下载配置
检查环境是否已有 首先检查一下电脑里有无maven环境,有的话就不用安装了 查看path环境中没有maven,开始准备接下来的重头戏 下载maven 下载bin.zip版 解压mavenxxxbin.zip (建议把解压的文件放在一个文件夹内,命名英文的env…...
python解析小说
前言 在信息爆炸的时代,网络上充斥着大量的小说资源,让人们能够随时随地尽享阅读的乐趣。然而,有些小说网站要求用户付费才能获取完整的内容,这给许多人带来了困扰,尤其是像我这类对金钱概念模糊的人。不过࿰…...
SQL Server 执行报错: “minus“ 附近有语法错误。
sql server 执行带 minus 的语句一直报错,如下图: 找了好久才知道minus是Oracle里面的语法,SQL server 应用 EXCEPT。...
kali linux查看局域网下所有IP,并对指定IP攻击
kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: ifconfig来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: fping -g 本机IP地址…...
基于QCC_BES 平台的LMS自适应滤波算法实现
+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) LMS算法是最小均方(Least Mean Square)算法的缩写。它是一种自适应滤波算法,常用于信号处理、系统辨识和自适应滤波等领域。 LMS算法的目标是通过对输入信号和期望输出信号之间的误差进行最小化,来调整滤波器的权重…...
大疆飞卡30运载无人机技术分享
大疆飞卡30是大疆公司面向运输领域推出的一款专业运载无人机。它采用了优秀的设计,装备了多种先进传感器,以解决运输中的难题。以下我们来了解一下其主要特点: 【应用领域】 飞卡30适用于山地救灾、农业化肥施用、工程材料运送等交通不便的山区应用,也适用于海岛联通等运输链…...
单片机的串口通信
今天,完整地总结一下普中科技的单片机的串口通信的硬件与编程,记录一下以后如果需要也比较方便捡起来。 单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。 对…...
【C/C++】STL学习所得
文章目录 STL 框架核心组成部分STL 序列容器分类STL 容器适配器分类STL 迭代器分类STL 中一些易混淆知识点一些重要的简述 STL 框架核心组成部分 算法容器迭代器适配器空间配置器访函数 STL 序列容器分类 vectorqueuelistarrayforward_list STL 容器适配器分类 stack 栈qu…...
leetcode几个数组题
数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址 二分查找 移除元素 有序数组的平方 209.长度最小的子数组...
单招网站开发/企业网站建设公司
eclipse插件的安装方法大体有以下三种:...
南宁培训网站建设/百度品牌推广
学习目标: 了解事件处理概念监听事件处理模型事件与事件监听接口实现事件监听方式回调事件处理模型常见的事件回调方法Handler类功能与用法Handler更新程序界面一、监听概念 再用户操作动作时,需要为用户的动作提供响应机制,这种机制就是事件处理 Android提供两套事…...
武安做网站/重庆的seo服务公司
laravel中的数据分页方式:$res Db::table(表名)->paginate(每页显示的数量);但是这样所获得的分页链接地址不对,所以还要在添加地址; $res->setPath(地址);注意:地址要在路由中定义渲染页面并加载数据ÿ…...
政府网站建设服务/艾滋病多久能查出来
sqoop导出数据到mysql需要启动yarn start-yarn.shsqoop导出hive统计数据到mysql----------------------------1.复制mysql驱动程序到sqoop/lib下2.在mysql中创建表createtable stat_act_day(day varchar(50),appid varchar(50),appplatform varchar(50),brand varchar(50),dev…...
python发布WordPress/搜索引擎优化内容包括哪些方面
云服务器到期了怎么迁移数据 内容精选换一换普通的按需实例(不含本地盘、FPGA卡)、竞价模式的竞价计费实例(不含本地盘、FPGA卡),关机后,基础资源(vCPU、内存、镜像)不再计费,绑定的云硬盘(包括系统盘、数据盘)、弹性公网IP、带宽等资源按各自…...
可以完成交易的网站 做/公司推广方案
4、常见函数的解读 Thread类的方法: sleep(long millis):让当前正在执行的线程休息多久,暂时让出cpu给其他线程执行,但是不会释放它所占有的对象锁。join():一个正在执行的线程调用了另外一个线程的join方法…...