QT学习笔记-信号与槽(干货)
一、什么是信号和槽(Signal and Slot)
可以和进程间通信的信号机制联系。
signal(信号,信号处理函数) // 进程间的通信方式
其中,该函数的作用就是接收到【信号】后应该做什么样的处理【信号处理函数】。
对应到QT中,信号就还是信号,槽函数就对应了信号处理函数。
举个例子:
窗口主体有个关闭按钮,点击这个按钮窗口就会关闭,那么关闭按钮是发送信号的对象,它发送的信号是点击,接受信号的对象是窗口,响应信号的槽是关闭窗口。
二、信号和槽点代码实例
(1)Qt4使用宏
Qt4版本中,主要是用connect + 宏的方式进行通信连接。
connect(发送对象,信号,接受对象,槽函数)
其中发送信号和槽函数需要使用SIGNAL()和SLOT()来进行声明。
例如 ,关闭窗口的例子,可以这样写:
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));
自定义槽函数:需要先将槽函数的声明添加到类的slots中。比如我们对一个QlineEdit控件添加一个接受textEdited信号的槽函数onTextEdited
#ifndef HOME_H #define HOME_H #include <QWidget> #include <QDebug> #include <QString> QT_BEGIN_NAMESPACE namespace Ui { class Home; } QT_END_NAMESPACE class Home : public QWidget { Q_OBJECT public: Home(QWidget *parent = nullptr); ~Home(); private slots: void func(QString); private: Ui::Home *ui; }; #endif // HOME_H
实现函数,使用connect与信号连接
#include "home.h" #include "ui_home.h" Home::Home(QWidget *parent) : QWidget(parent) , ui(new Ui::Home) { ui->setupUi(this); connect(ui->lineEdit, SIGNAL(textEdited(QString)), this, SLOT(func(QString))); } void Home::func(QString s) { qDebug()<<s; } Home::~Home() { delete ui; }
这样写的好处是信号和槽函数直观,缺点是因为使用宏,编译时不做类型检查,如果有问题的时候只能运行的时候才能发现。
(2)Qt5新的connect函数
Qt5推出了新的connect函数,不需要使用SIGNAL()和SLOT()宏,可以在编译时做类型检查。
#ifndef HOME_H #define HOME_H #include <QWidget> #include <QDebug> #include <QString> QT_BEGIN_NAMESPACE namespace Ui { class Home; } QT_END_NAMESPACE class Home : public QWidget { Q_OBJECT public: Home(QWidget *parent = nullptr); ~Home(); void func(QString); private: Ui::Home *ui; }; #endif // HOME_H
#include "home.h" #include "ui_home.h" Home::Home(QWidget *parent) : QWidget(parent) , ui(new Ui::Home) { ui->setupUi(this); // connect(ui->lineEdit, SIGNAL(textEdited(QString)), this, SLOT(func(QString))); connect(ui->lineEdit, &QLineEdit::textEdited, this, &Home::func); } void Home::func(QString s) { qDebug()<<s; } Home::~Home() { delete ui; }
Qt5的connect函数中,信号和槽函数的参数都是函数指针,当信号或槽函数有重载时,使用函数指针可以明确告诉编译器使用哪个重载函数,避免歧义。
(3)使用QT creator 洁面添加信号的槽函数(右键-转到槽)
直接通过 Qt Creator界面来完成发送信号和槽函数的连接,右键-转到槽
选择信号
实现槽函数
#include "home.h" #include "ui_home.h" Home::Home(QWidget *parent) : QWidget(parent) , ui(new Ui::Home) { ui->setupUi(this); // connect(ui->lineEdit, SIGNAL(textEdited(QString)), this, SLOT(func(QString))); connect(ui->lineEdit, &QLineEdit::textEdited, this, &Home::func); } void Home::func(QString s) { qDebug()<<s; } Home::~Home() { delete ui; } void Home::on_pushButton_clicked() { qDebug()<<"自动生成的槽函数"; }
本文作者:Jev_0987
本文链接:https://www.cnblogs.com/jev-0987/p/17877318.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步