声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!)
往期回顾:
【QT入门】实现一个简单的图片查看软件-CSDN博客
【QT入门】图片查看软件(优化)-CSDN博客
【QT入门】 lambda表达式(函数)详解-CSDN博客
【QT入门】 Qt槽函数五种常用写法介绍
一、信号槽基本概念
Qt的信号槽是一种用于处理事件和通信的机制,是Qt框架中的一个重要特性。信号槽机制使得对象之间可以进行异步通信,无需显式调用对方的方法,从而实现了对象之间的解耦和灵活的交互。
1、信号(Signal):
信号是一种特殊的成员函数,用于通知其他对象发生了某个事件或状态的改变。信号在类中声明为signals关键字,并不包含实际的实现代码。信号可以带有参数,用于传递额外的信息给槽函数。
2、槽(Slot):
槽是用于响应信号的成员函数,可以执行相应的操作或处理逻辑。槽在类中声明为slots关键字,并实现具体的逻辑,槽函数的参数列表必须与信号的参数列表一致,或者可以接受更多参数。
通过connect函数将信号与槽连接起来,使得当信号被发射时,相关的槽函数会被调用。
连接可以是一对多的关系,即一个信号可以连接多个槽函数,也可以是多对一的关系,即多个信号可以连接到同一个槽函数。我们来看看其四个参数
connect(1.信号的发送者、2.发送的信号(函数的地址)、3.信号的接收者、4.接收后信号的处理(槽函数)的地址)
3、示例:
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::btnslot);
一一对应, ui里的pushButton控件时信号的发送者,发送了一个cliced点击信号,当前主窗口接收了这个信号,接收后调用当前窗口的btnslot方法,也就是所说的槽函数,进行了响应。
4、第五个参数
当然,实际上Qt的connect是五个参数,还有最后一个参数用于指定信号槽连接类型,但是我们一半不写,因为默认是自动连接类型。我们看看第五个参数类型:
AutoConnection | 自动连接,Qt会根据信号发送者和接收者的线程自动选择连接类型。 |
DirectConnection | 直接连接,信号发送时,槽函数会立即在发送者所在的线程中执行。 |
QueuedConnection | 队列连接,信号发送时,槽函数会被投递到接收者所在的线程的事件队列中,在接收者线程空闲时执行。 |
BlockingQueuedConnection | 阻塞队列连接,与QueuedConnection类似,但发送者会等待槽函数执行完成后才继续执行。 |
UniqueConnection | 唯一连接,确保相同的信号和槽不会被重复连接。 |
在Qt中使用这些连接类型来控制信号槽的行为,以确保在多线程环境下正确地处理信号和槽的执行顺序和线程关系。
二、五种槽函数写法
1、第一种: Qt4写法
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(btnslot()))
现在呢已经不推荐这种写法,因为如果SIGNAL写错了,或者信号名字、槽函数名字写错了,
编译器检查不出来,导致程序无响应,引起不必要的误解,也不便于找到问题。
2、第二种: Qt5写法
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::btnslot);
推荐使用这种写法,信号名字、槽函数名字写错了,编译器会直接报错。
3、第三种:lambda表达式写法
connect(ui->pushButton,&QPushButton::clicked,[=](参数){
//具体代码
QMessageBox::information(this,"title","Qt5_signal_slot");
});
推荐使用,适用于slot代码比较少的逻辑
注:槽函数里写参数,可以比实际的参数数量少,比如实际有一个形参,我们就可以不写,可以写那一个,但是不可以写两个 。
4、第四种:牵线法
这种方法就是在ui控件上,点击控件绑定一个槽函数,然后再自己写槽函数逻辑,但是看着比较混乱,不太推荐。
5、第五种:自动生成法
在ui设计界面里直接点击控件,选择转到槽,再在里面选择槽函数。(通过这个方式,还可以很直观的看到某个控件有哪些槽函数)
而且这个方法用的挺多的,很方便,同时也可以选择自己手写,命名是on_控件名_信号名;分别在.h声明和.cpp实现就是,如果是自定义的槽函数一般都是do开头
比如我对ui界面的一个pushbutton控件绑定槽函数
void MainWindow::on_pushButton_clicked()
{
QMessageBox::information(this,"title","Qt5_signal");
close();
}
以上就是Qt槽函数五种常用写法介绍。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!