Qt多个信号连接到一个槽,在槽中识别信号的发送者方法

本文详细介绍了在Qt中如何使用信号与槽机制进行事件传递,特别是在多个不同类型的物件发送信号时,如何在槽中识别这些信号并做相应处理。通过示例展示了如何利用dynamic_cast和sender()函数实现对不同物件类型信号的识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

例如:

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

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

void FBx::get_keyvalue(bool)
{
    if (QPushButton* btn = dynamic_cast<QPushButton*>(sender())){

        send_key(btn->whatsThis());

    }
    else if (QRadioButton *rtn = dynamic_cast<QRadioButton*>(sender())){

        send_key(rtn->whatsThis());
    }
}

  在 槽(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中的语句就不会执行了。

参考

http://blog.chinaunix.net/uid-23023942-id-3135387.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值