QT的信号与槽

        从本文开始,将由简到深的开展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 。

  1. 同线程场景

    • 若信号发送者和槽接收者属于同一线程(例如都在主线程),Qt::AutoConnection 会自动退化为 Qt::DirectConnection
    • 表现:信号发出后,槽函数立即同步执行emit 语句后的代码需等待槽函数完成后才能继续执行 。
  2. 跨线程场景

    • 若信号发送者和槽接收者属于不同线程(例如子线程信号触发主线程槽),Qt::AutoConnection 会自动退化为 Qt::QueuedConnection
    • 表现:信号发出后,槽函数被加入接收线程的事件队列,由接收线程的事件循环异步处理,emit 语句后的代码立即执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值