Qt信号与槽介绍

connect(const QObject *sender, const char *signal, 
const QObject *receiver, const char *method, 
Qt::ConnectionType type = Qt::AutoConnection)


// demo
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));

// 连接方式

// 宏连接
connect(scrollBar, SIGNAL(valueChanged(int)),label,  SLOT(setNum(int)));
// 函数指针连接
connect(scrollBar, &QScrollBar::valueChanged,label,  &QLabel::setNum);
// 匿名函数
connect(scrollBar, &QScrollBar::valueChanged,this,  [=](){});

(1)connect函数参数介绍

参数1:信号的发出者

参数2:信号发出者的信号函数

参数3:信号接受者

参数4:信号接收者的槽函数

参数5:信号与槽的连接方式,默认值自动连接

(2)参数5的介绍

一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。

**Qt::AutoConnection****:** 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

**Qt::DirectConnection****:**槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。

**Qt::QueuedConnection****:**槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

**Qt::BlockingQueuedConnection****:**槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

**Qt::UniqueConnection****:**这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

enum ConnectionType {
        AutoConnection,
        DirectConnection,
        QueuedConnection,
        BlockingQueuedConnection,
        UniqueConnection =  0x80
    };

一、信号与槽的本质

        Qt信号和槽是一种用于实现对象间通信的机制。其本质是一种事件驱动的机制,通过信号和槽的连接,当信号被触发时,槽函数会被自动调用,从而实现对象间的通信和交互。

         信号是一种特殊的函数,用于表示某种事件的发生,当事件发生时,信号会被自动发送出去,通知所有连接到该信号的槽函数。

        槽是一种特殊的函数,用于处理信号的触发事件,当槽函数被连接到某个信号时,当该信号被触发时,槽函数会自动被调用,从而实现对信号的响应。

        信号和槽的连接是通过Qt的元对象系统实现的,每个QObject派生类都有一个元对象,用于存储该类的属性、方法和信号槽信息。通过元对象系统,可以在运行时动态地连接信号和槽,从而实现对象间的通信。

        总之,Qt信号和槽是一种事件驱动的机制,通过信号和槽的连接,实现了对象间的通信和交互。

二、优缺点

        优点:

        ①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。

        ②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。

        ③灵活性。一个信号可以关联多个槽,或多个信号关联同一个槽。

        不足:速度较慢。与回调函数相比,信号和槽机制运行速度比直接调用非虚函数慢10倍。

        原因:①需要定位接收信号的对象。②安全地遍历所有关联槽。③编组、解组传递参数。④多线程的时候,信号需要排队等待。(然而,与创建对象的new操作及删除对象的delete操作相比,信号和槽的运行代价只是他们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值