Qt元对象系统 —— 信号与槽

news/2024/10/28 13:41:31/

信号与槽讨论的是Qt对象之间的连接与交互。我们就是使用这种方式实现了一个简单的异步调用。换而言之,信号与槽让我们可以不必考虑复杂的调用。只需要当我们需要在程序中表达:“希望在程序中通知一个事件而且按照我们设定的方式给出回应”的时候,信号与槽就会排上用场。举个例子:

connect(ui->lineedit, &QLineEdit::textChanged, this, &MyClass::handle_line_edit_change)

表达了我们确认一个连接:当LineEdit的文字一发生改变就通知我们的MyClass做出对应的举措。具体的举措在handle_line_edit_change函数已经得到了定义!

当我们想要对一个重载的信号连接槽函数的时候,注意QOverLoad的使用,他负责消除连接的二义性。

我们知道,Qt的信号与槽是在Qt自己家的EventLoop监控的,所有的signals都会放到一个队列等待一个个发送(非常异步),当然,具体我们可以做出调整:这是在connect里的ConnectionType中给出设置:

  • AutoConnection: 默认连接方式。根据发射信号和接收槽的对象所在的线程自动选择连接类型。如果信号和槽在同一线程中,则使用直接连接;如果在不同线程中,则使用队列连接。

  • DirectConnection: 直接连接,信号发射后立即调用槽函数。适用于信号和槽在同一线程的情况。

  • QueuedConnection: 队列连接,信号发射后将调用槽函数的请求放入接收对象所在线程的事件队列中,稍后处理。这在跨线程通信时非常有用。

  • BlockingQueuedConnection: 阻塞队列连接,类似于队列连接,但在信号发射后会阻塞直到槽函数处理完成。这通常在需要确保槽函数在信号发射后立即执行时使用。

  • UniqueConnection: 用于确保同一对信号和槽之间只连接一次。如果尝试重复连接,将不会添加新的连接

当然,取消一个连接也很简单:disconnect函数的调用就会将监控给移除掉。这样我们的信号再发送的时候就不会发生槽函数对应的调用了。

#ifndef STUDENT_H
#define STUDENT_H
#include <QDebug>
#include <QObject>
​
class Student : public QObject {Q_OBJECT
public:explicit Student(QObject* parent = nullptr){}
​
public:QString getName() const {return name;}
​void setName(const QString& name) {this->name = name;emit notifyNameChange();}
​void disconnect_this() {disconnect(this, &Student::notifyNameChange, this,&Student::handle_change);}
​void handle_change() {qDebug() << "Change !";}
​
signals:void notifyNameChange();
​
private:QString name;
signals:
};
​
#endif  // STUDENT_H
#include <QCoreApplication>
#include <QMetaProperty>
#include "Student.h"
void handle_change() {qDebug() << "Yes, the name has changed!";
}
​
int main(int argc, char** argv) {QCoreApplication a(argc, argv);auto             stu = new Student;stu->setName("Charliechen");stu->disconnect_this();stu->setName("1111");a.exec();delete stu;
}

你会发现只有第一次设置的时候给出了响应,但是后面的就没有了。这是因为我们的程序已经disconnect了连接。


http://www.ppmy.cn/news/1542594.html

相关文章

C# 创建型设计模式之----单例模式

设计模式相信很多人在大学都有学过&#xff0c;当时学的时候肯定都学懂了的但在后来的程序开发中却很少会用到&#xff0c;好像其实际意义并不大。下面对其的简单说明希望能对大家的实际开发有所帮助和理解&#xff0c;当然这也仅是我的个人见解。用做自己的备忘录功能。 1、单…

《手写Spring渐进式源码实践》实践笔记(第十一章 AOP-基于JDK、Cglib实现对象动态代理)

文章目录 第十一章 基于JDK、Cglib实现对象动态代理背景目标设计实现代码结构类图代理案例解析案例代码运行结果拆解案例 实现步骤 测试事先准备自定义拦截方法测试用例测试结果&#xff1a; 总结 第十一章 基于JDK、Cglib实现对象动态代理 背景 到本章节我们将要从 IOC 的实现…

《创新:不灭的火炬》学习笔记

1.毛利率和研发强度用于刻画价值链和研发链。 2.三大重点领域&#xff1a;数字经济&#xff08;美国高研发投入占据产业链高毛利环节&#xff09;&#xff0c;绿色经济&#xff08;中国研发投入有领先地位&#xff09;&#xff0c;生物经济&#xff08;欧美不可替代较强&#…

基于阿里云服务的移动应用日志管理方案—日志的上传、下载、存档等

前言 如题&#xff0c;基于阿里云服务&#xff08;ECS、OSS&#xff09;实现 APP 的用户日志上传以及日志下载的功能&#xff0c;提高用户反馈问题到研发去分析、定位、解决问题的整个工作流的效率。 术语 ECS: 云服务器ECS&#xff08;Elastic Compute Service&#xff09;…

10.23Python_Matplotlib_‘backend_interagg‘ has no attribute

问题引入&#xff1a; 问题&#xff1a; import matplotlib.pyplot as plt import numpy as np# 创建数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) y3 np.tan(x)# 创建图形 fig plt.figure(figsize(12, 4))# 第一个子图 ax1 fig.add_subplot(1, 3, 1) ax…

【深搜算法】(第四篇)

目录 求根节点到叶节点数字之和&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树剪枝&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 求根节点到叶节点数字之和&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1…

【WiFi7】 支持wifi7的手机

数据来源 Smartphones with WiFi 7 - list of all latest phones 2024 Motorola Moto X50 Ultra 6.7" 1220x2712 Snapdragon 8s Gen 3 16GB RAM 1024 GB 4500 mAh a/b/g/n/ac/6e/7 Sony Xperia 1 VI 6.5" 1080x2340 Snapdragon 8 Gen 3 12GB RAM 512 G…

【IC每日一题】

IC每日一题 1 代码题&#xff1a;异步复位&#xff0c;同步释放2 八股题&#xff1a;同步复位VS异步复位 初步打算新开一个系列会包括&#xff1a;一个代码题 一个基本知识题&#xff1b; 1 代码题&#xff1a;异步复位&#xff0c;同步释放 题目&#xff1a;使用verilog来设…