概述
信号槽是Qt特有的机制。
信号槽,实际上是观察者模式 (发布 - 订阅模式)。当某个事件发生之后,就会发出一个信号,这种信号是没有目的的,如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,即将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。就像类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
信号的本质就是事件,如鼠标单机,释放等操作,按钮按下等。
Qt中我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件,Qt中信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测。
槽的本质是一类具有特殊功能的函数,可以作为类的普通成员函数来使用。可以对 Qt 框架中产生的信号进行处理。槽函数的所有者也是某个类的实例对象。
标准信号槽的使用
在 Qt 中我们需要使用 QOjbect类中的 connect 函数进行二者的关联。
Qt类内部自带的信号称为标准信号。Qt类内部提供的功能函数可以作为触发信号的处理动作,称为标准槽函数。
标准信号和槽可以通过Qt助手查阅,如果没有找到并不代表没有,可以看当前类从父类继承下来了哪些信号。
// 单击按钮关闭窗口
//其中参数依次为:信号发出者,发出的信号,信号的接收者,槽函数
connect(ui->closewindow, &QPushButton::clicked, this, &MainWindow::close);
自定义信号槽的使用
除了Qt自带的信号槽,我们可以使用自定义的信号槽。如果想要在Qt类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:
要编写新的类并且让其继承Qt的某些标准类
这个新的子类必须从QObject类或者是QObject子类进行派生
在定义类的头文件中加入 Q_OBJECT 宏
自定义信号对应的函数只有声明,没有定义。自定义信号是有条件的。
信号是类的成员函数
返回值必须是 void 类型
信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
发送信号的本质就是调用信号函数:emit 函数名
自定义槽也是有条件的。
返回值必须是 void 类型
槽函数需要指定多少个参数, 需要看连接的信号的参数个数
槽函数的参数是用来接收信号传递的数据的, 信号传递的数据就是信号的参数
Qt 中的槽函数可以是类的成员函数、全局函数、静态函数、Lambda表达式
注意事项
一个信号可以连接多个槽函数
需要写多个connect()连接
槽函数执行顺序是随机的,与connect调用顺序无关
信号接收者可以是一个或多个对象
一个槽可以连接多个信号,多个不同信号处理动作是相同的
需要写多个connect()连接
信号可以连接信号
信号接收者可以不处理接收的信号,而是继续发射新的信号,这相当于传递了数据,并没有对数据进行处理
信号槽可以断开
使用语法
//方式一
connecct(ui->button,SIGNAL(clicked()),this,SLOT(onButton()));
//方式二
connect(ui->button,&QPushButton::clicked,this,&SignalSlot::onButton);
//方式三
connect(ui->button,&QPushButton::clicked,this,[=](){...});