回调函数与Qt信号槽

回调函数的本质是基于“想让别人的代码执行自己的代码,而别人的代码你不能随意改变”这种思维产生的,回调函数是函数指针的一种用法,如果多个类都关注某个类的状态变化,此时需要维护一个列表,以存放多个回调函数的地址,对于每一个被关注的类,都需要做类似的工作,效率低且不灵活。
Qt为了消除回调函数的弊端,开发了一种新的消息传递机制,即信号和槽。
这种机制能够自动有效的组织和管理继承自QObject的Qt对象,被称为对象树。这种机制在UI编程上具备优势,能够帮助程序员环节内存泄漏问题,当应用程序创建了一个具有父窗口部件的对象时,该对象被加入父窗口的child列表,当父窗口被销毁时,child列表中的对象被一一删除,子类释放的顺序与构造顺序相反。
当一个对象的内部状态发生改变时,如果其他对象对它的状态改变需要作出反应,只需让这个类发出状态改变的信号。
信号的注意点:
1.所有信号的声明都是公有的,所以不能在signals前面加public,private,proteed。
2.信号没有返回值。
3.信号不需要定义。
4.必须直接或间接继承自QObject类,并且开头私有声明包含Q_OBJECT
5.在同一线程中,一个信号被emit,会立即执行slot函数,slot函数执行结束后才执行emit后面的代码,若信号连接多个槽,等所有槽函数执行结束后继续执行后面代码,槽函数执行顺序按照连接顺序,不同线程即跨线程时,槽函数的执行是随机的。
6.可将信号与槽的连接方式进行设置,发出信号不需等待槽函数执行完,而是直接执行后面代码,通过设置connect第5个参数。
7.信号与槽要求参数一致,即参数类型一致,若不一致,允许信号的参数比槽函数多,但槽函数的参数顺序必须与信号的前几个一致。槽函数参数可以比信号少,但不能使用信号中不存在的参数。
槽函数是一个普通的C++函数,可以是虚函数,static函数,也可以被重载,可以公有,私有,也可以被其他函数调用,唯一特点就是可以和信号连接。
Connect函数,有两个原型

static QMtaObject::Connect connect{
	const QObject *Sender,//信号发送对象指针
	const char *signal,//信号函数字符串,使用SIGNAL()
	const QObject *receiver,//槽函数对象指针
	const char *member,//槽函数字符串,使用SLOT()
	Qt::ConnectionType = Qt::AutoConnection);
}
connect(pushButton,SIGNAL(clicked()),dialog,SLOT(close()));
static QMtaObject::Connect connect{
	const QObject *Sender,//信号发送对象指针
	const char &signal,//信号函数字符串,使用SIGNAL()
	const QObject *receiver,//槽函数对象指针
	const char &member,//槽函数字符串,使用SLOT()
	Qt::ConnectionType = Qt::AutoConnection);
}
connect(pushButton,&QPushButton::clicked,dialog,&QDialog::close);

此方式在编译期间可以进行拼写检查,参数检查,类型检查,并且支持参数的兼容性转换。

你可能感兴趣的:(Qt,qt,开发语言)