QT 信号与槽

来源:互联网 发布:ubuntu 卸载cuda 编辑:程序博客网 时间:2024/06/05 06:13

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);

注释

  1. sender 为信号发送者,receiver 为信号接收者,它们都是对象指针。
  2. 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将会给出警告。

原创粉丝点击