Qt------信号槽,属性,对象树

目录

1,信号槽

1.1,槽函数执行顺序

1,槽函数执行顺序

复制代码
connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile()));
emit  downloadFile();
renameFile();

看上述代码,现在有这样的一个问题,当我用 emit 发出信号后,我是执行完槽函数之后再执行renameFile函数呢,还是发出信号后立即就执行renameFile函数呢?

答案是 会先执行完槽函数之后,再执行后面的函数,并不是两者并发执行。

2,信号与多个槽同时连接,槽函数的执行顺序

复制代码
connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile2()));
connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile3()));
connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile1()));
emit  downloadFile();

当一个信号和多个槽函数连接之后,执行顺序是什么样的呢?

上述代码的执行顺序为 onDownloadFile2() , onDownloadFile3() , onDownloadFile1()。

所以 当一个信号连接多个槽函数时,执行顺序就是connect的顺序

1.2,获取信号发出者

在槽函数中 利用sender() 可以获取信号发出者。

复制代码
void Widget::on_pushButton_clicked()
{
  QPushButton* btn = dynamic_cast<QPushButton*>(sender());
  qDebug()<<btn->text();
}

1.3,断开连接

disconnect();

在 Qt 中,disconnect函数用于断开信号与槽之间的连接,以阻止信号发射时调用相应的槽函数。disconnect函数有多种重载形式,以下是常见的使用方式:
1. 断开特定对象的特定信号与特定槽的连接

cpp

复制代码
// 假设我们有两个对象,senderObject发送信号,receiverObject接收信号并执行槽函数
QObject *senderObject = new QObject();
QObject *receiverObject = new QObject();

// 连接信号与槽
QObject::connect(senderObject, &QObject::destroyed, receiverObject, [&]() {
    qDebug() << "senderObject 被销毁,receiverObject 接收到信号";
});

// 断开连接
QObject::disconnect(senderObject, &QObject::destroyed, receiverObject, [&]() {
    qDebug() << "senderObject 被销毁,receiverObject 接收到信号";
});

在这个例子中,QObject::connect建立了senderObject的destroyed信号与receiverObject的一个匿名槽函数的连接。之后,QObject::disconnect使用相同的参数断开了这个连接。这样,当senderObject被销毁时,匿名槽函数将不再被调用。

2. 断开一个对象的所有信号与另一个对象的所有槽的连接

cpp

复制代码
QObject *sender = new QObject();
QObject *receiver = new QObject();

// 建立多个连接(这里假设已经建立了多个信号槽连接)
// 断开 sender 的所有信号与 receiver 的所有槽的连接
QObject::disconnect(sender, nullptr, receiver, nullptr);

在这个重载形式中,sender的所有信号与receiver的所有槽之间的连接都会被断开。
3. 断开一个对象的特定信号与所有连接的槽的连接

cpp

复制代码
QObject *object = new QObject();

// 连接信号与多个槽(假设已经建立了多个连接)
// 断开 object 的 destroyed 信号与所有连接的槽的连接
QObject::disconnect(object, &QObject::destroyed, nullptr, nullptr);

这里使用nullptr作为接收者和槽函数的参数,表示断开object的destroyed信号与所有连接的槽的连接。

4. 断开一个对象的所有连接

复制代码
QObject *object = new QObject();

// 连接信号与多个槽(假设已经建立了多个连接)
// 断开 object 的 destroyed 信号与所有连接的槽的连接
QObject::disconnect(object, nullptr, nullptr, nullptr);

1.4,QSignalMapper 用法

QSignalMapper 是一种map容器,它的主要作用是能够建立一个对象的映射关系,这个对象是用来发送信号的对象,

void setMapping(QObject *sender, int id); 此函数用来建立映射关系。

QSignalMapper 是 Qt 框架中的一个类,它允许将一个信号映射到另一个信号,并可以在映射过程中传递不同的数据。它常用于将多个具有相同信号的对象连接到同一个槽函数,但希望根据发送信号的对象或其他参数执行不同的操作。

复制代码
 QSignalMapper *signalMapper = new QSignalMapper(this);
    signalMapper->setMapping(ui->btn1,1);
    signalMapper->setMapping(ui->btn2,2);
    signalMapper->setMapping(ui->btn3,3);

    connect(ui->btn1,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
    connect(ui->btn2,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
    connect(ui->btn3,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));

    connect(signalMapper,&QSignalMapper::mappedInt,this,&Widget::dealPushbuttons);

void Widget::dealPushbuttons(const int& btnid)
{
    if(btnid == 1)
    {
        qDebug()<<"btn1";
    }
    else if(btnid == 2)
    {
        qDebug()<<"btn2";
    }
    else if(btnid == 3)
    {
        qDebug()<<"btn3";
    }
}

如上图所示代码,btn按钮的clicked信号与 QSignalMapper 的map()槽函数连接。

map()槽函数会发送 mapped信号。

将mapped信号与我们自定义的槽函数相互连接,然后最终我们自定义的槽函数就能获取map 中的key对应的value值,来判断是哪个对象发出的信号,然后做出相应操作。

相关推荐
徐小黑ACG4 分钟前
Golang 基础05 结构体struct
开发语言·算法·golang
优橙教育21 分钟前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
半杯咖啡半行码40 分钟前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
SEO_juper1 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
西柚小萌新1 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
北极有牛1 小时前
cpp学习笔记--常量指针
java·开发语言·算法
半杯咖啡半行码1 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
caoerzhong2 小时前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
时间的拾荒人2 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
MayZork2 小时前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt