少女祈祷中...

1.摘要

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣, 它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函 数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接 的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个 操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。)

2.简单的分析使用

1
2
3
connect(发出信号的对象,发出的信号,接收信号的对象,接收到信号之后需要调用的函数(槽函数))

connect(sender, signal(信号), receiver, slot(槽));

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。(可以忽略部分传来的信号参数),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)

  • 实例演示(电机按钮关闭窗口)
1
2
3
4
5
6
7
8
QPushButton *close = new QPushButton(this);
//设置文字
close->setText("close");
//设置按钮位置
close->move(0,0);

//用信号和槽去实现点击按钮关闭窗口
connect(close,&QPushButton::clicked,this,&QWidget::close);

2.1自定义信号与槽

使用 connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制 并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。