QT5 之信号与槽机制(信号与槽的基本介绍)
QT5 之信号与槽机制
1.1 什么是信号和槽
信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽用于对象间的通讯,信号/槽机制是Qt的一个核心特征。
在图形用户界面编程中,我们经常通过信号槽将一个窗口部件的一个变化通知给另一个窗口部件。
• 信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
• 槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
• 信号与槽的连接
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
• 特点
一个信号可以连接多个槽
当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
信号直接可以相互连接
发射第一个信号时,也可以发射第二个信号。
• 应注意的问题
1. 信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
2. 如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
3. 宏定义不能用在 signal 和 slot 的参数中。
4. 信号和槽的参数个数与类型必须一致。
1.2 信号与槽的示例程序
1.2.1手动关联
1. 将按钮的点击信号,关联到对应的槽函数。
connect(ui->pushButton_delete_server,SIGNAL(clicked()),this,SLOT(slot_delete_Server())); |
参数解析:
ui->pushButton_delete_server :信号源对象
SIGNAL(clicked()):信号源发出的信号
This :接收端的对象
SLOT(slot_delete_Server()):接收端的槽函数
1.2.2 自动关联
1.3 自定义信号槽
1.3.1 定义自己的信号和槽函数
自定义的信号和槽函数都需要在类体类定义!
示例代码:
/*继承与TCP服务器*/ class tcp_server : public QTcpServer { public slots://自定义槽函数 void tcp_server_slot_RXdata(QString str, int len); signals: /*声明自定义信号*/ void Tcp_Server_Signal(QString str, int len);//在文本框显示收到的数据 }; |
注意:信号和槽函数可以有新参,但是不能有返回值!
1.3.2 发送自定义信号
示例代码:
void tcp_server::tcp_server_slot_RXdata(QString str, int len) { emit Tcp_Server_Signal(str,len); //发送信号 } |
emit 关键字用来发送信号!
语法:
emit 信号;
1.4 两个类之间的信号通讯
如果要实现B类访问A类的数据,定义信号的和槽的方法!
步骤:
1. 在A类定义一个槽函数。
2. 在B类定义一个信号。
3. 在A类的成员函数里关联信号与槽!
connect(B类的对象指针,SIGNAL(B类的信号)),A类的对象指针,SLOT(A类的槽函数)); |
4. 在B类的成员函数发送定义的信号
emit 信号函数; |
5. B类发送信号之后,A类的槽函数将会得到相应!!
- 点赞
- 收藏
- 关注作者
评论(0)