所谓信号槽,实际就是观察者模式(发布-订阅模式)。
当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。
也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
信号是由对象发射出去的消息,信号实际上是一个特殊的函数,不需要由程序员实现,而是由Qt的Qt Meta Object System实现。
槽实际上就是普通的函数,成员函数、全局函数、静态函数、lambda函数都可以!
当我们把对象的信号和槽绑定在一起之后,当信号触发时,与之绑定的槽函数将会自动调用,并把信号的参数传递给槽函数!
[static] QMetaObject::Connection connect(
const QObject *sender,
const QMetaMethod &signal,
const QObject *receiver,
const QMetaMethod &method,
, Qt::ConnectionType type = Qt::AutoConnection)
[static] QMetaObject::Connection connect(
const QObject *sender,
PointerToMemberFunction signal,
Functor functor)
解析:
- sender: 信号的发送者
- signal: 发送的信号
- receiver: 信号接收者
- method:接受到信号之后,自动调用的方法(槽函数)
- type: 表示信号与槽的连接类型,有默认值
例如
Widget::Widget(QWidget* parent) :QWidget(parent) {
//设置窗口的大小
resize(200, 200);
QPushButton* btn = new QPushButton("我是个按钮", this);
connect(btn, &QPushButton::pressed, this, &Widget::close);
}
- btn:作为信号的发送者
- &QPushButton::pressed:信号函数,表示你pressed(点击)
- this:信号的接收者,表示的就是Widget这个窗口
- &Widget::close:槽函数,表示接收信号之后准备干什么,即close掉这个窗口。