从本文开始,将由简到深的开展QT开发的知识。如有错误之处,望大家批评指正,如果觉得写的不错,希望点赞支持,你们的点赞是我创作的动力。谢谢大家!
一、基本概念
信号(Signal)
- 定义:信号是对象状态变化或事件发生时发出的通知,例如按钮点击(
clicked()
)或数据更新(dataChanged()
)。信号只需声明,无需实现,由 Qt 的元对象系统(Meta-Object System)自动生成代码
槽(Slot)
- 定义:槽是响应信号的函数,可以是普通成员函数或专门声明为槽的函数(通过
slots
关键字修饰)。
二、信号与槽的连接方式
整个信号与槽的过程就是connect(连接),将发起对象和接收对象的连接。动作也可以拆解为发起者、发起者的动作、接收者、接收者的动作。
首先分别创建信号与槽:
signals:
void send(const QString str);
private slots:
void receive(const QString str);
void MainWindow::receive(const QString str)
{
qDebug()<<str;
}
下一步是进行连接,采用connect。即发起对象this,发起对象的动作&MainWindow::send。
接收者this,接收者对象的动作&MainWindow::receive
connect(this,&MainWindow::send,this,&MainWindow::receive);
调用的方法:
emit send("Hello World");
三、连接类型
最后叙述一个信号与槽的连接类型,一般是参数5这个位置
connect(参数1,参数2,参数3,参数4,参数5);
类型一般分为默认行为:
Qt::DirectConnection
Qt::QueuedConnection
默认情况下,参数5不进行填写,系统会判定为Qt::AutoConnection
根据线程关系自动选择 Direct
或 Queued
。
-
同线程场景
- 若信号发送者和槽接收者属于同一线程(例如都在主线程),
Qt::AutoConnection
会自动退化为Qt::DirectConnection
。 - 表现:信号发出后,槽函数立即同步执行,
emit
语句后的代码需等待槽函数完成后才能继续执行 。
- 若信号发送者和槽接收者属于同一线程(例如都在主线程),
-
跨线程场景
- 若信号发送者和槽接收者属于不同线程(例如子线程信号触发主线程槽),
Qt::AutoConnection
会自动退化为Qt::QueuedConnection
。 - 表现:信号发出后,槽函数被加入接收线程的事件队列,由接收线程的事件循环异步处理,
emit
语句后的代码立即执行。
- 若信号发送者和槽接收者属于不同线程(例如子线程信号触发主线程槽),