Qt信号与槽

基本使用

1 直接在UI界面中定义信号与槽,但自定义性差
2 在UI界面中转到槽,QT自动在类定义中生成private slot,然后在槽函数中编写功能
3 使用connect(sender,signal,receiver,slot)

//基本参数形式
connect(btn,SIGNAL(clicked(bool)),r,SLOT(func(type1,type2)))//使用宏
connect(btn , &QPushButton::click,r,&ClassName::func)//使用函数指针
//当槽函数有重载版本时,如一个无参数版,一个int参数版,则使用下方式来避免歧义(也可以考虑用第一种参数形式)
connect(btn , &QPushButton::click,r,static_cast<void (ClassName::*)(int)> (&ClassName::x))
//使用场合
1 在构造函数中connect
2 使用QObject::connect,可在任意地方进行关联
3 使用具体的obj.connect,也可在任意地方进行关联

自定义信号与槽

1 创建信号

//在类声明中
class some:public QObject//使用信号槽的必须是QObject
{
	Q_OBJECT//必须是QObject
	...
signal:
	void sig(type val);//信号必须返回void,还可以指定参数,在触发信号时(emit时)将参数传递到槽函数中
}

2 创建槽
同上,只不过使用的是slots关键字,并且有权限控制(public/private等(与普通函数一样)),其实就相当于普通函数,甚至能直接调用它,唯一的区别在于槽函数能与信号交互
3 使用emit
对于自定义信号,需要在某函数中使用emit触发信号

void trigger(type val)
{
	...//函数其他操作
	emit sig(val)//需要注意的是,使用emit时signal标识符应在可见的作用域内
}

其他

1 一个信号可以关联多个槽函数,一个槽函数也可以被多个信号关联
当一个信号关联了多个槽函数时,则按照connect的顺序依次执行
2 获取sender

//必须在某槽函数内
void Meta::on_ageChanged()
{
    //使用sender获取发出信号的对象本身,注意使用dynamic cast
    QPerson* p=qobject_cast<QPerson*>(sender());
    ...
}

3 使用disconnect,参数与connect一致,用于切断信号与槽的关联
4 全局信号
5 私有信号,只能由父类(抽象类)实现发出,不能在子类代码中显式发出。
私有信号可以用于信号连接,但不能由用户发射。

signals:
    void mySignal(QPrivateSignal)//添加一个QPrivateSignal参数即可

6 connect也可以连接两个signal,一般在对象权限不够时使用,通过另一个有权限的signal来触发slot

connect(btn,SIGNAL(clicked(bool)),r,SIGNAL(otherSignal()))//能否传参还待考究

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值