QObject::sender()

我们如何在槽函数中获取到信号的发送对象呢,使用sender()方法即可获取。但是使用此方法我们需要注意几点:

QObject *QObject::sender() const

1、使用sender()方法获取信号的发送对象,前提是槽函数是被信号触发的,而非自己调用,否则返回空(nullptr),所以我们在使用的时候最好加个非空判断;
2、通过此方法获取的对象指针仅在槽函数执行的期间有效;
3、如果在此期间,信号发送对象被销毁,或者信号与槽函数已经断开,此对象指针将无效;
4、此方法虽然违背了面向对象的模块化原则,但是当多个信号连接同一个槽函数的时候,可以通过此方法获取到发送信号的对象,根据这个对象来判断当前是哪个信号触发的槽函数,当我们多个信号绑定一个槽函数的时候,一般是需要根据信号的不同来做不同的操作,所以这里可以获取到实际发生信号的对象,那我们就知道是哪个信号,然后就可以去处理了。

如下方代码,如果有多个信号连接到onDealWork槽函数,我们可以根据objectName()属性/对象的类型进行区分来处理不同的工作,其他区分的方式也都可以,具体看实际情况。

通过对象的objectName

void onDealWork()
{QObject* obj = sender();if(obj->objectName() == "Btn"){// todo;}else if(obj->objectName() == "Label"){// todo;}else if(obj->objectName() == "Edit"){// todo;}
}

通过对象的类型

void onDealWork()
{QObject* obj = sender();QObject* obj = sender();QPushButton* pBtn = dynamic_cast<QPushButton*>(obj);if (pBtn != nullptr){// todo;}QLabel* pLabel = dynamic_cast<QLabel*>(obj);if (pLabel != nullptr){// todo;}
}
5、当我们使用 Qt::DirectConnection 类型作为信号槽的连接方式,且槽函数调用的线程不同于信号发送对象的线程,这个时候sender()方法返回的QObject对象指针是无效的,这种场景是不可以使用此方法来获取信号发送对象的。
大家可以使用下方代码进行测试,在槽函数中使用sender()获取的对象指针实际为nullptr,所以大家最好是获取到指针之后加上非空判断。
实际上使用Qt::DirectConnection连接方式,信号的触发和槽函数执行都是在同一个线程中,大家可以使用下方代码查看线程id,Qt::HANDLE mainId 和 Qt::HANDLE childId,使用 Qt::DirectConnection两者id一致,也就是处在同一个线程,使用 Qt::QueuedConnection或者默认不填,两者id是不一样的,表示不在同一个线程。
class Worker : public QObject
{Q_OBJECTpublic slots:
void doWork(const QString &parameter) {Qt::HANDLE childId = QThread::currentThreadId();QString result;QObject* obj = sender();if (obj != nullptr){result = sender()->objectName();qDebug() << "current connect type is Qt::QueuedConnection";}else{// 如果多线程情况下,信号槽使用Qt::DirectConnection这种连接方式;// 这里sender()返回空指针nullptr;qDebug() << "current connect type is Qt::DirectConnection";}emit resultReady(result);
}signals:void resultReady(const QString &result);
};class Controller : public QObject
{Q_OBJECTQThread workerThread;
public:Controller() {this->setObjectName("123");Worker *worker = new Worker;worker->moveToThread(&workerThread);connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);// 如果使用此方式,在多线程的时候,默认是Qt::QueuedConnection;//connect(this, &Controller::operate, worker, &Worker::doWork);connect(this, &Controller::operate, worker, &Worker::doWork, Qt::DirectConnection);connect(worker, &Worker::resultReady, this, &Controller::handleResults);workerThread.start();}~Controller() {workerThread.quit();workerThread.wait();}
public slots:void handleResults(const QString & result){qDebug() << result;}
signals:void operate(const QString &);
};// 测试代码;
void test()
{Qt::HANDLE mainId = QThread::currentThreadId();Controller* control = new Controller();emit control->operate("test");
}

下图中是使用VS调试过程中sender()返回的值为空(nullptr)。


Qt训练营内容(一期) 开始啦 ,更多详细的文章有兴趣的小伙伴可以点击看一看哈,里面有更多优质的内容等着你!也可以加群 861353824 一起交流哈!

Qt信号槽之槽函数中获取发送信号对象——sender()相关推荐

  1. matlab离散方波信号,MATLAB - 在ODE15s函数中生成方波信号?(MATLAB - Generate square signal in ODE15s function?)...

    MATLAB - 在ODE15s函数中生成方波信号?(MATLAB - Generate square signal in ODE15s function?) 我试图从函数内部生成一个方形信号,通过O ...

  2. ajax onclick() 获取最新输入的文本框的值,如何从jQuery onclick函数的Ajax函数中获取值?...

    我有一个按钮,当我点击它时,它会从我的数据库中获取数据,并根据ID将其显示在我的文本区域中.如何从jQuery onclick函数的Ajax函数中获取值? JQuery的 $('#verifyBtn' ...

  3. Linux-C基础知识学习:C语言作业-将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印。

    Linux基础知识学习 C语言作业:将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印. #include <stdi ...

  4. Vue.js:vue指令(给标签属性赋Vue变量v-bind,绑定事件 v-on)vue事件处理函数中, 拿到事件对象,6个事件修饰符

    1. 给标签属性赋Vue变量v-bind 在vue中,v-bind指令可以动态的给标签的属性设置值, 语法:v-bind:属性名="vue变量" 简写::属性名="vue ...

  5. 信号与系统sa函数求积分_信号与系统_第三章_学习心得

    [TOC] 信号的正交分解 相关系数 $$ C_{12}=\frac{\int_{t_1}^{t_2}f_1(t)f_2(t)dt}{\int_{t_1}^{t_2}f_2^2(t)dt} $$ 正交 ...

  6. linux进程被信号杀死,Linux 命令 - kill: 向进程发送信号

    kill 命令通常用来 "杀死"(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序.kill 命令准确地说并不是 "杀死" 进程,而是给进程发 ...

  7. php获取函数里参数吗,php函数中获取参数信息方法(记录)

    1.func_num_args() 返回传递给该函数参数的个数 function foo() { $numargs = func_num_args(); echo $numargs; //输出3 } ...

  8. python返回函数值并退出函数_如何在python的阻塞的函数中获取变量值

    目前是使用C++嵌入式的python函数 python函数是阻塞式的接收服务器消息 直到退出监听才会有返回值 监听中收到消息会调用python的一个回调函数,可以获取到收到的消息 所以要怎么样来返回消 ...

  9. ajax回调函数中获取到的日期类型为时间戳

    示例代码: 页面: $("#test").click(function(e) { $.get( "/test", function(data) { consol ...

最新文章

  1. 有关EUV光刻机,你需要知道这些
  2. 字节流 system.in
  3. CodeSmith(2):对象和控制台
  4. 程序员保值的5个秘密
  5. 【C语言】结构体赋值
  6. Leetcode--442. 数组中重复的数据
  7. mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣
  8. Windows系统(cmd)常用命令
  9. 23种设计模式(五)单一职责之装饰模式
  10. oracle中求商函数,三个方便实用的Oracle分析函数
  11. Bat批处理脚本--常用命令
  12. Sentaurus TCAD Inspect
  13. js 弹窗中写html代码,简单了解JavaScript弹窗实现代码
  14. [中英字幕]吴恩达机器学习系列课程 笔记
  15. pc端ui图片尺寸_PC端网页尺寸设计一
  16. snapchat_Snapchat的新地图功能介绍(以及如何禁用它)
  17. 四分位数和百分位数_20种四分位数
  18. 计算机win7如何加快开机速度,电脑启动越来越慢如何提升win7开机速度
  19. 1024程序员节前夕,Bug与Debug的随笔
  20. 实体店运营:能提高顾客留存率的店铺陈列方式

热门文章

  1. 2017.2.10【初中部 GDKOI】模拟赛B组 方格游戏(game) 题解
  2. 机器学习基石-05-1-Recap and Preview
  3. 解读 2022 诺贝尔生理学或医学奖 | MedChemExpress
  4. 2022CCPC预选赛J Roulette
  5. 不属于软件性能测试的范畴,兼容性测试_以下哪种软件测试不属于广义软件性能测试的范畴______。...
  6. 使用java语言实现移位密码加密过程
  7. 谈谈火车票信息泄漏问题
  8. 毕索大学计算机科学怎么样,毕索大学计算机硕士介绍
  9. 使用showdown将markdown笔记插入到HTML网页
  10. C语言——兔子繁殖问题多解