Qt信号与槽——建立信号与槽
平常我们所见到的界面,鼠标点击一下指定的按钮,就会产生一定的效果。C++ Qt框架中的信号与槽机制是Qt进行对象间通信的一种方法,非常核心且有别于传统的回调函数或者消息传递机制。通过信号与槽,Qt能够在不同的对象之间安全地传递信息,而且这种机制是类型安全的。
信号 (Signals):信号是由对象发出的消息,告知程序发生了某个事件(如用户点击按钮)。信号仅有声明,没有定义,它们被定义在QObject或其任何子类中。当特定事件发生时,相应的信号就会被发射(emit)。例如,QPushButton类有一个clicked()信号,当用户点击按钮时,这个信号被发射。
槽 (Slots):”槽是用来响应信号的函数。当与信号相连的槽收到信号时,它就会被调用。和信号一样,槽也是QObject或其子类的成员。槽可以是普通的成员函数,也可以是lambda表达式或其他可调用的对象。
信号与槽的连接 (Connecting Signals and Slots):要使信号和槽一起工作,需要将它们连接起来。Qt提供了QObject::connect函数(静态函数)来实现这一点。当连接建立后,如果信号被发射,对应的槽就会被调用。
一、 简单界面
方法一 :演示新建一个QT项目。在ui设计界面,拖动一个button,下面有发送者、信号、接受者、槽,+ - 表示添加和删除。手动设置,如下的功能是点击窗口的按钮,窗口自动关闭。
方法二:了解即可。在下图的配置框中设置即可。
二、复杂事件设置信号与槽
方法一:自动连接(使用UI文件),通过命名约定自动连接信号与槽。
拖拽一个按钮,右键选择“转到槽”,选择相应的信号。
然后就可以在相应的函数进行操作。
运行点击按钮,生成结果。
void Widget::on_pushButton_clicked()
{
std::cout << "方法一btnuiClicked" << std::endl;
}
//on_pushButton_clicked()命名的槽会自动连接到相应的信号。
//原型是on_objectName_signalName
方法二:使用QObject::connect
拖拽一个按钮
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//方法二:在构造函数中进行信号与槽的绑定 这里信号是个宏
//QObject::connect(const QObject *sender, SIGNAL(signal()), const QObject *receiver, SLOT(slot())) 这里信号是个宏
QObject