基本使用
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()))//能否传参还待考究