文章目录
前言:
Qt信号与槽机制是一种用于处理对象间通信的强大机制,它是Qt框架的核心特性之一。信号与槽机制使得Qt对象可以在不了解彼此的情况下进行通信,这种松耦合的设计思想极大地提高了代码的可重用性和灵活性。
一、信号与槽机制
1、基本概念
在Qt中,一个对象可以发出一个信号,而另一个对象的槽函数可以接收这个信号并作出响应。信号是一个类的成员函数,当某个特定的事件发生时,它会被自动调用。槽函数也是类的成员函数,它可以被信号连接,当信号发出时,槽函数会被自动执行。下面是与信号槽机制相关的基本概念,如下:
1)信号
在Qt中,信号是一个特定的成员函数,用于在某个特定事件发生时被发射
(emit)。信号本身并不实现任何功能,它只是表明某个事件已经发生。信号可以被定义为一个类的成员函数,但其实现是由Qt的元对象系统自动完成的。信号的声明通常在类的头文件中进行,使用signals关键字来标记。
2)槽
槽是普通的成员函数,可以被信号触发。当信号被发射时,与之连接的槽函数将被调用。槽函数可以实现具体的功能,比如更新界面、处理数据等。槽函数的声明和普通成员函数一样,但在Qt的元对象系统中需要进行一些特殊的标记,以便与信号进行连接。
2、信号与槽函数连接
信号与槽的连接是通过
QObject::connect()函数实现的,需要注意的是,为了使类支持信号与槽机制,需要在类的声明中包含Q_OBJECT宏。下面介绍几种不同的连接方式,如下:
2.1、connect+宏实现信号与槽连接
在Qt4及之前的版本基于connect+宏实现信号与槽绑定,其中发送信号和槽函数需要用
SIGNAL()和SLOT()来进行声明,connect函数声明如下:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
下面是一段示例代码,如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 登录按键绑定槽函数
connect(this->ui->btn_ok, SIGNAL(clicked(bool)), this, SLOT(login()));
}
void MainWindow::login()
{
QString username = ui->lineEdit_username->text();
QString password = ui->lineEdit_password->text();
if (username == "jack" && password == "12345") {
qDebug() << "login success";
} else {
qDebug() << "login fail";
}
}
基于connect+宏实现信号与槽连接,需要注意下面这些问题
- 声明槽函数要使用
private slots或public slots关键字 - 信号和槽参数不能包含任何变量名,只能包含类型
2.2、Qt5新connect函数
Qt5推出了新的
connect函数,不需要使用SIGNAL()和SLOT()宏,可以在编译时做类型检查,connect函数声明如下:
QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal,
const QObject

最低0.47元/天 解锁文章
339

被折叠的 条评论
为什么被折叠?



