QT 信号与槽
GUI程序,为了处理用户的的点击事件,一般是用的回调函数去处理事件,但QT独创了一种信号与槽的机制,通过信号与槽的绑定,事件发出信号,由槽处理。信号与槽的连接主要是关于 connect()函数,它让两个互不相干的对象连接起来,当一个对象的状态改变时,可以通知另一个对象。
关于 connect()函数
和普通的C++成员函数很像,可以是虚函数(virtual),也可被重载(overload),可以是公有的(public),保护的(protected),它们可以像任何c++成员函数一样被调用,可以传递任何类型的参数。不同在于一个槽函数能和一个信号相连接,只要信号发出了,这个槽函数就会自动被调用。信号和槽函数间的链接通过connect实现。
connect函数原型
connect(QObject *sender, char *signal,QObject *receiver, char *method);
connect(QObject *sender, PointerToMemberFunction signal,QObject *receiver, PointerToMemberFunction method);
connect(QObject *sender, PointerToMemberFunction signal,QObject *context, Functor functor);
connect(QObject *sender, QMetaMethod &signal,QObject *receiver, QMetaMethod &method);
connect(QObject *sender, PointerToMemberFunction signal, Functor functor);
注释
- sender 为信号发送者,receiver 为信号接收者,它们都是对象指针。
- connect() 函数返回值类型为QMetaObject::Connection,表示当前连接句柄。最后一个参数为Qt::ConnectionType type = Qt::AutoConnection,表示连接类型 一般默认。
1. 一个信号可以连接到多个槽
connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBar(int)));
将滑块的值改变信号,连接微调框的设置值大小的槽和当前对象的更新状态栏的槽。
当信号发出后,槽函数都会被调用,但是调用的顺序不确定,随机的。
2. 多个信号可以连接到一个槽
connect(lcd, SIGNAL(over()), this, SLOT(handleError());
connect(calculator, SIGNAL(divisionError()), this, SLOT(handleError()));
将lcd的over()信号和计算器的divisionError()信号与当前对象的handleError()的槽连接。
任何一个信号发出,槽函数都会被执行。
3.一个信号可以和另一个信号相连
connect(lineEdit, SIGNAL(textChanged(Qstring &)), this, SIGNAL(update(Qstring &)));
将文本框的文本改变信号与当前对象的更新信号相连。
第一个信号发出后,第二个信号也同时发送,除此之外,信号与信号连接上,和信号和槽连接相同。
注:信号和槽函数必须有着相同的参数类型。
这样信号和槽函数才能成功连接。如果信号里的参数个数多余槽函数的参数,多余的参数被忽略:
connect(ftp, SIGNAL(rawReply(int, const Qstring &)), this, SLOT(checkError(int)));
如果参数类型不匹配,或者信号和槽不存在,则当应用程序使用debug模式构建后,Qt会在运行期间发出警告。如果信号和槽连接时包含了参数的名字,Qt将会给出警告。