QT 信号与槽

信号与槽的由来:
其他用户交互是利用回调函数来进行用户交互的,所谓的回调是指:你自己定义一个函数,并告诉系统何时为何调用。你可以写一个特定数量和类型参数的函数,然后告诉系统何时使用,并传递给它所需的参数,系统就会调用你定义的函数,处理参数,并给你返回值。
所谓的回调函数是指:按照一定的形式由开发人员定义并编写实现内容。使用回调函数,实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(也就是回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,也就是某种事情发生的时候,利用传递的函数地址调用回调函数,这时开发人员可以利用这个机会在回调函数中处理消息或完成一定的操作。
回调函数只能是全局函数,或者是静态函数,因为这个函数只是在类中使用,所以为了维护类的完整性,我们一般用类的静态成员函数来做回调函数。

术 语___________________________________解 释
用户事件_________________指程序的用户所产生的事件。例如:点击鼠标或拖动滚动条
程序事件_________________指程序所产生的事件。例如:当用户点击鼠标后程序退出
发射信号_________________指“发出”或“发送”一个信号。例如:当你点击鼠标时,将发送一个clicked()信号。为了发送这个信号,使用emit关键字。
内部状态_________________当谈论信号时,你可能知道或者听说过“内部状态已经改变”。这就意味着对象内部数据已经发生改变,因此对象发送或发射一个信号。
MOC____________________元对象编辑器。用于构造用户自己的信号和槽。它处理Qt特有的关键字(例如:emit),创建合法的C++代码。
1、信号和槽机制是在QObject类中实现的。
2、槽函数需要注意的地方:槽函数中不能有默认值,同样信号的参数也不能有默认值。在槽的参数中尽量不使用自定义的数据类型,因为这样将会使通用性降低。
3、信号只能通过定义这个信号的类及其派生类发射。
4、信号是由MOC自动生成的,必须在.cpp文件中实现,而且永远没有返回值。
5、函数指针不能作为信号和槽的参数
6、不能把友元声明friend放在信号或者槽的声明部分
7、信号和槽不能被升级(把继承的成员函数升级为公有状态,这个C++特征对信号和槽并不适用(没有用过不是特别明白))
8、类型宏不能用于信号和槽的参数中(因为元对象编辑器不能展开#define,所以,在信号和槽中类型宏作为一个参数不能工作)
9、嵌套类不能放在信号部分或者槽部分,也不能含有信号和槽
10、构造函数不能用于信号部分和槽部分(为什么一个人会把一个构造函数放到信号部分或者槽部分,这对于大家来说都是很有意思的事情。无论如何也不能这样做。请把它们放到private、protected或者public部分中,它们本来就属于那个地方。)
11、属性的声明应该放在含有相应的读写函数的公有部分之前(如果在public之后声明属性,元对象编译器将不能找到函数或者解析这个类型)

定义信号的方式:

signals: //关键字信号
        void newName(QString &name); // 定义的信号

发送信号的方式:

QString name;
emit newName(name);//发送信号

定义槽的方式:

向类定义中加入槽方法的原型。这个原型必须与它将要接收的信号一样(也就是说,具有同样的一套参数)。由于槽是方法,所以,在作为槽使用的同时,也可以被直接调用。槽的方法可以设置成为公有的属性。

// 槽分三种:public、private和protect后面都要跟slot
public slots:
void nameChanged(QString &name);
private slots:

信号和槽连接的方式:

connect(sender,SIGNAL(newName(QString &)),this,SLOT(nameChanged(QString &)));

在信号和槽使用中需要注意:
1、不要创建死循环(如果名为firstfun()的方法发送了一个A信号,A信号被second()槽所接收,而second()槽发送了信号B,最后,名为firstfun()的方法接收了信号B,这样就产生了一个死循环。这种循环将一直执行,直到该程序崩溃为止(或者用户进入长时间的等待)。)
2、信号和槽在连接时一定要参数匹配。

猜你喜欢

转载自blog.csdn.net/bloke_come/article/details/76177225