【Qt】槽函数中获取发出信号的对象


核心:QObject::sender()
对于信号与槽的连接
connect( obj1 , SIGNAL(sigFun()) , obj2 , SLOT(slotFun()) )
或者
connect( obj1 , &Object1::sigFun , obj2 , &Object2::slotFun )
可以通过信号与槽函数的参数来传递数据


但是存在一些情况,我们希望能在slotFun()里去获得obj1对象指针
实际上可以通过Qt基类QObject::sender(),在槽函数里获得绑定的信号的来源对象,解决一些动态绑定信号与槽的情况下,非常有用


例子:
菜单栏中的最近打开文件列表
最近打开文件地址列表
QList<QString> FileList;
生成对应的QAction
for(int i=0;i<FileList.size();i++)
{

QAction *act=new QAction(FileList[i]);

act->setData(FileList[i]);

connect(act, SIGNAL( triggled() ), this , SLOT( slotFun() ));
}
我们在QAction里动态setData了一些数据
正常情况,只能知道触发了菜单QAction,由于是动态创建的QAction,所以没办法在槽函数slotFun里确定是哪个QAction触发了这个槽,所以也就没办法获取act->Data()里的数据
那么在槽函数里使用QObject::sender(),我们就能获得触发该槽函数的信号的对象
slotFun()
{

QAction *act=qobject_cast<QAction*>(sender());//使用Qt的类型转换,将指针恢复为QAction类型

qDebug()<<act->Data();
}


当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,所以你在对应的slot里就可以通过  sender()得到当前是谁invoke了你的slot,对应的是QObject->d->sender.

有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理

QObject::Sender()返回发送信号的对象的指针,返回类型为QObject *

示例代码:

  1. QTimeEdit *editor = qobject_cast<QTimeEdit *>(sender());  

此时可以对editor进行进一步的处理了。

你在一个槽里面,调用这个函数,返回的就是你信号来源的对象;
QPushButton *aaaa = new QPushButton(this);
比如 connect(aaaaa, SIGNAL(Click()), this, SLOT(Onaaaaa());

void Onaaaaa(){
      QPushButton *ccc  = (QPushButton*) sender();
}

这个CCC就是aaaa这个对象来的。


Qt是通过信号和槽的机制进行事件传递的,当有多个不同类型、或相同类型的物件的发送信号都通过一个槽来处理的时候,需要在槽中识别出这些信号然后做相应的处理。

例如:

在一个界面中有16个按钮(QPushButton)和4个(QRadioButton)这20个物件的SIGNAL(clicked(bool))都连接(connect)到同一个按键的处理槽中(void get_keyvalue(bool))

那么就需要在get_keyvalue这个槽中把这些信号的发送者都识别出来,然后取其相应的键值然后发送,其方法是:

  1. void FBx::get_keyvalue(bool)
  2. {
  3.     if (QPushButton* btn = dynamic_cast<QPushButton*>(sender())){
  4.         send_key(btn->whatsThis());
  5.     }
  6.     else if (QRadioButton *rtn = dynamic_cast<QRadioButton*>(sender())){
  7.         send_key(rtn->whatsThis());
  8.     }
  9. }

 

在槽(SLOT)中sender()函数会返回一个指向QObject 的指针来指向信号的发送者(Returns a pointer to the object that sent the signal, if called in a slot activated by a signal;)。然后通过C++ RTTI(Run-Time Type Identification)机制提供的dynamic_cast运算符,在执行的时候检查sender()返回的对象是否是QPushButton类,如果是则将sender()返回的QObject指针转换为QPushButton指针,然后if中的语句就会执行。如果sender()返回的对象不是QPushButton类型的指针,则dynamic_cast就会返回0,if中的语句就不会执行了。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值