信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。
所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪 个后执行。
![](http://hi.csdn.net/attachment/201107/25/0_13115591706fTg.gif)
信号:
可以是用控件自带的一些信号,如pushbutton的clicked()信号等。也可以自己定义,在头文件中定义:
signals:
void mysignal();
槽:
可以是object自带的槽,如QApplication的quit()等。也可以自己在头文件中定义:
slots:
void myslot();
信号与槽的关联:
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]
这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect 调用中接收者参数可以省略。
如下,让按钮具有退出的作用:
QPushButton *button=new QPushButton(this);
connect(button,SIGNAL(clicked()),qApp,SLOT(quit()));
这里将按钮button的点击clicked信号与程序qApp的退出quit()槽关联类起来。这里的信号和槽都是类中自带的。
当点击按钮时,触发quit()方法,quit()调用exit()使应用程序退出。
也可以在ui设计界面拖入pushbutton,然后右击button选择转到槽
然后选择clicked:
![](http://hi.csdn.net/attachment/201107/25/0_1311559247BqpT.gif)
下面编写相应的处理函数即可:
void Dialog::on_pushButton_clicked()
{
//qApp->quit();
qApp->exit();
}
在响应函数里可以调用sender()获得发送信号的对象
如
QPushButton *btn=(QPushButton*)sender();
btn->setText("adfdfds");
这样也可以实现,原理是相同的。