信号和槽的定义
QT编程提供了一种信号和槽的机制
信号:类似于成员函数、成员变量一样的东西
槽:本质就是C++成员函数
信号和槽都需要定义在类中,信号和槽利用connect函数连接起来
例如:connect(信号发出者,发出的信号,信号接收者,做出的反应【槽处理】)
需要注意的是:
1.发出的信号与槽处理参数都是函数的地址,函数的地址要带上作用域
2.信号和槽都可以发生重载,重载后的函数地址要利用函数指针的技术明确出来
3.信号只需要声明,不需要实现;但是槽函数需要声明和实现
4.信号源发出信号需要自定义触发函数,关键字是 emit
5.可以使用disconnect函数断开信号和槽之间的连接
部分代码示例:
//实例化出来两个对象--将其挂靠在窗口上,不用想着释放内存了
m_teacher=new teacher(this);
m_student=new student(this);
//将信号和槽连接起来
//connect(m_teacher,&teacher::hungry,m_student,&student::treat);
//如果要触发事件,还需要有自触发关键字
//触发信号
//学习---信号和槽的重载版本---要利用函数指针的技术---明确指向函数地址
//当使用重载版本以后,原来的函数地址的指向就不明确,需要用函数指针的技术来明确其地址
void (teacher:: * teachersignal)(QString foodName)=&teacher::hungry; //definition:定义,清晰 redeclaration:声明、表白
void (student:: * studentslot)(QString foodName)=&student::treat;
connect(m_teacher,teachersignal,m_student,studentslot); //使用未声明的XX--有可能是标点符号的问题
//触发信号
//信号和槽可以断开连接
disconnect(m_teacher,teachersignal,m_student,studentslot);
isover();
信号和槽的扩展
1.信号可以连接信号
connect(信号源1,发出的信号,信号源2,发出的信号)
void (teacher:: * teachersignal)(void)=&teacher::hungry; //definition:定义,清晰 redeclaration:声明、表白
void (student:: * studentslot)(void)=&student::treat;
connect(m_teacher,teachersignal,m_student,studentslot);
connect(button,&mybutton::clicked,m_teacher,teachersignal);
当第一个信号源发出信号的时候,第二个信号源也发出信号,第二个的信号接收者也作出反应
这是一个完整的流程,很是不错
2.一个信号可以连接多个槽函数
写法就是正常的写法
3.多个信号可以连接同一个槽函数
与2基本类似
4.信号和槽的参数类型要一一对应,但是信号的参数个数可以多于槽函数的参数个数
意思就是-->信号和槽的参数类型要一致,但不能理解为什么
5.信号和槽可以断开连接
disconnect即可