一、引入
上一篇笔记,我们只是单纯的创建了一个按钮,就相当于是摆设一样并没有加入什么功能。那么现在我们引入信号与槽机制让按钮“动起来”。
二、信号与槽介绍
信号槽是QT引以为豪的机制之一,所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
上一篇笔记我们已经创建了这个按钮界面:
只是这个界面,我们点击这两个按钮是没有变化的,那我们加入一个简单的信号在看一下:
QObject::connect(&button1,SIGNAL(clicked(bool)),&a,SLOT(quit()));
这时候我们点击按钮1,widget这个界面就关闭了。
函数原型为:QObject::connect(const QObject *,const char*,const OBject *,const char*); QObject是Qt中所有类的父类,connect()是Qt类都会有的函数。同时这个函数也是我们最常用的函数,参数说明:第一个参数:发送信号的对象;第二个参数:发送对象发送的信号;第三个参数:接收信号的对象;第四个参数:接收对象在接收到信号之后所需要调用的函数。特别说明:因为我使用的是Qt4所以signal和slot只有const char *这么一种形式。这里我们使用了两个宏SIGNAL和SLOT将这两个函数名转化为字符串。
三、自定义信号槽
先看效果:点击打开会得到一个新的窗口
代码:recevie.h
#ifndef RECEVIE_H
#define RECEVIE_H
#include <QObject>
#include <QWidget>
#include <QDialog>
#include <QPushButton>
class Recevie : public QDialog
{
Q_OBJECT
public:
Recevie();
};
#endif // RECEVIE_H
recevie.cpp
#include "recevie.h"
Recevie::Recevie()
{
this->setWindowTitle("窗口2");
QPushButton *button1 = new QPushButton("haha",this);
button1->move(100,100);
}
signal_self.h
#ifndef SIGNAL_SELF_H
#define SIGNAL_SELF_H
#include <QWidget>
#include <QPushButton>
#include "recevie.h"
class Signal_self : public QWidget
{
Q_OBJECT
public:
Signal_self(QWidget *parent = 0);
~Signal_self();
public slots:
void slot_new_widget();
};
#endif // SIGNAL_SELF_H
signal_self.cpp
#include "signal_self.h"
Signal_self::Signal_self(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("窗口1");
QPushButton *button1 = new QPushButton("打 开",this);
QPushButton *button2 = new QPushButton("退 出",this);
button1->move(100,100);
button2->move(100,150);
this->connect(button1,SIGNAL(clicked(bool)),this,SLOT(slot_new_widget()));
}
void Signal_self::slot_new_widget()
{
Recevie widget1;
widget1.exec();
}
Signal_self::~Signal_self()
{
}
特别说明: 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外)。
后面Qt的学习还有使用很多的信号和槽机制,多用用很快就会熟练啦!!!