在Qt框架中,connect
函数是一个非常核心的函数,用于实现信号(Signals)和槽(Slots)之间的连接,它是Qt信号槽机制的关键所在。信号槽机制是一种高级的通信方式,允许对象在状态改变时通知其他对象,而无需知道这些对象是谁。这种方式促进了对象之间的松耦合,增强了代码的模块化和可维护性。
【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制-CSDN博客
connect() 函数原型
static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection);
参数说明
- sender:指向发出信号对象的指针。
- signal:指向信号函数的C字符串(信号函数)。
- receiver:指向接收信号对象的指针。
- method:指向槽函数或接受者可以调用的普通函数的C字符串(旧式语法)。
- type:连接的类型,默认为Qt::AutoConnection。
连接类型
从Qt 5开始,connect
还可以指定连接的类型,决定了信号和槽的调用方式:
Qt::AutoConnection
(默认):自动选择最佳的连接类型。Qt::DirectConnection
:信号被发出后,槽函数立即在发出信号的线程中执行。Qt::QueuedConnection
:槽函数在接收者所在线程的事件循环中排队等待执行,适用于不同线程间的通信。Qt::BlockingQueuedConnection
:类似于Qt::QueuedConnection
,但会阻塞发出信号的线程,直到槽函数执行完毕。Qt::UniqueConnection
:如果连接已经存在,则不建立新的连接。
Lambda表达式作为槽函数
从Qt 5.10起,你还可以使用lambda表达式作为槽函数,进一步增加了灵活性
QObject::connect(button, &QPushButton::clicked, this, [](){
qDebug() << "Button clicked!";
});
代码示例:关闭窗口按钮
功能:在窗口中设置一个按钮,并在单击该按钮时将其关闭。
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton* button = new QPushButton(this);
button->setText("close");
button->move(300,300);
connect(button,&QPushButton::clicked,this,&QWidget::close);
}
Widget::~Widget()
{
delete ui;
}
运行代码
点击按钮后窗口自动消失。