QT基础 信号与槽 QT5.12.3环境

一、信号与槽

1. 作用

实现对象与对象之间的通讯,本质就是将某个信号与某个操作提前建立绑定,后面

只要收到该信号,就去执行某个操作。


2. 语法

cpp 复制代码
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method) [static]

功能: 静态方法, 建立信号与槽的连接 (提前进行约定)
参数:
    sender:信号的发出者, 是一个指针
    signal:信号,  &发出者类名::信号名
    receiver: 信号的接受者, 是一个指针
    method: 处理信号的槽函数, &接受者::槽函数名

PS: 信号与发出者是同一个类, 接受者与槽函数是同一个类。


3. 标准信号/ 标准槽函数

在帮助手册中,搜索指定类,然后再目录中找到signals,点击找到想要的信号。

在帮助手册中,搜索指定类,然后再目录中找到public slots,点击找到想要的槽函数。如果当前类没有,再去父类中查找。


4. 自定义槽函数

1) 有关键字 pulic slots 修饰
2) 槽函数的返回值为void类型
3) 内容按照具体需求实现

5. 自定义信号

1) 有关键字 signals 修饰
2) 信号只有声明没有实现
3) 信号可以提供参数
4) 信号可以被重载
5) 如果信号重载,不能直接实现信号与槽, 有两种解决方案:
第一:通过指定类型的函数指针保存信号的地址
cpp 复制代码
void (Widget::*pfun)(int) = &Widget::signal ;
// void (Widget::*pfun1)() = &Widget::signal ;
connect(this,pfun , this, &Widget::signalSlot);
第二:通过static_cast<>()进行类型转换
cpp 复制代码
connect(this,static_cast<void (Widget::*)(int)>(&Widget::signal), this,&Widget::signalSlot);
QT5版本之前信号与槽的写法
cpp 复制代码
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));
  1. 信号通过SIGNAL宏定义表示, 槽函数通过SLOT宏定义表示.

  2. 这种写法简单,如果有信号或者槽重载,可以直接选择指定类型的信号与槽

  3. 这种写法不安全, 编译不对语法进行检查,运行时才能检测到错误,不推荐使用。


6. 信号与槽的关联关系

cpp 复制代码
QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method));

信号与信号相连

QObject::connect( sender, SIGNAL(signal), receiver, SIGNAL(signal));

同一个信号连接到多个槽

QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method1));

QObject::connect( sender, SIGNAL(signal),receiver, SLOT(method2));

......

多个信号连接到同一个槽

QObject::connect( sender, SIGNAL(signal1),receiver, SLOT(method));

QObject::connect( sender, SIGNAL(signal2),receiver, SLOT(method));

......

7. 信号与槽的参数对应关系

1) 信号的参数个数必须大于等于槽的参数个数,以槽函数的参数个数为主导,如果槽函数需要1个参数, 信号发送时至少传递1个参数。
2) 参数类型必须一一匹配
3) 如果参数非常多,那么封装类或者结构体传递
相关推荐
Zilliz Planet10 分钟前
Milvus×EasyAi:如何用java从零搭建人脸识别应用
java·开发语言·milvus
天天进步201517 分钟前
Java全栈项目 - 汽车维修服务管理平台
java·开发语言·汽车
CodeClimb26 分钟前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
qq_4305839728 分钟前
QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
开发语言·笔记·qt
Crossoads35 分钟前
【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应
android·开发语言·数据库·深度学习·机器学习·计算机外设·汇编语言
Zik----37 分钟前
Anaconda搭建Python虚拟环境并在Pycharm中配置(小白也能懂)
开发语言·人工智能·python·机器学习·pycharm
易码智能39 分钟前
【RealTimeCallBack】- KRTS C++示例精讲(4)
c++·定时器·kithara·windows 实时套件·krts
凯子坚持 c44 分钟前
解锁仓颉编程语言的奥秘:枚举类型、模式匹配与类接口全解析
开发语言·华为·harmonyos
小王爱吃月亮糖44 分钟前
QT-QVariant类应用
开发语言·c++·笔记·qt·visual studio
计科土狗1 小时前
基于c语言的union、字符串、格式化输入输出
c++