【QT入门】 Qt槽函数五种常用写法介绍

不吃~香菜 2024-07-13 14:35:04 阅读 75

声明:该专栏为本人学习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槽函数五种常用写法介绍。


都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。