信号和槽
目录
一.标准信号槽函数(顺序为:发送者→信号→接收者→反应)
二.一些信号函数
**toggled()**是指如单选按钮的互相转换,适合状态监控。帮助手册中的QAbstractButton里。
canceld()
pressAndHold()
三.自定义槽函数
-
example:(老师→饿了→学生→学生请吃饭)
梳理一下:
- “饿了“属于老师的行为,所以应该定义在老师类的signals里;
- “学生请吃饭”是学生对老师发出信号时做出的反应,所以应该定义在学生类的public slots(公开槽函数)里;
- 然后”老师→饿了“这个信号触发需要一个触发信号函数,这个触发信号函数根据需要定义在不同的类里;
- 最后连接信号槽。
根据步骤进行实现:
-
1.定义信号
class Teacher { public: Teacher(); signals: void hungry(); }; void Student::treat() { qDebug() << "Student treat teacher"; }
-
2.定义槽函数
class Student { public: Student(); public slots: void treat(); };
-
3.定义触发信号函数
void MyWidget::ClassIsOver() { //发送信号 emit teacher->hungry(); }
-
4.连接信号槽
teacher = new Teacher(this); student = new Student(this); connect(teacher,&Teacher::hungury,student,&Student::treat);
四.自定义信号槽重载
void hungry(QString name); 自定义信号
void treat(QString name ); 自定义槽
1.但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,所以需要利用**函数指针**来指向函数地址, 然后在做连接
void (Teacher:: * teacherSingal)(QString) = &Teacher:: hangry;
void (Student:: * studentSlot)(QString) = &Student::treat;
connect(teacher,teacherSingal,student,studentSlot);
2.也可以使用static_cast静态转换挑选我们要的函数
connect(
teacher,
static_cast<void(Teacher:: *)(QString)>(&Teacher:: hangry),
student,
static_cast<void(Student:: *)(QString)>(& Student::treat));
五.信号和槽的连接
1.一个信号和多个槽连接,槽函数按连接顺序执行。
测试如下:
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));
结果如下:
OnPushButtonClicked1
OnPushButtonClicked2
OnPushButtonClicked3
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));
结果如下:
OnPushButtonClicked2
OnPushButtonClicked1
OnPushButtonClicked3
2.多个信号与一个槽连接。
只要触发其中任意一个信号,槽函数就会被调用。如一个页面中有多个按钮可以关闭页面。
3.一个信号与另一个信号相连。
一个信号发出触发到另一个信号的发出。
4.信号和槽断开连接。
用disconnect断开连接,用法与connect一致。但通常不适用,因为当一个对象delete后,Qt会自动取消所有连接到对象上的槽。