QT中connect()的参数5:Qt::DirectConnection、Qt::QueuedConnection区别

原文链接:https://blog.csdn.net/Dasis/article/details/120916993

connect用于连接QT的信号和槽,在qt编程过程中不可或缺。它其实有第5个参数,只是一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。

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


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

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


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


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

                        

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt,信号和槽是用于对象间通信的一种机制。当一个对象发出一个信号时,与之相连的槽函数会被调用。默认情况下,在连接信号和槽时,Qt会根据对象所在的线程自动选择合适的连接方式。如果两个对象在同一线程Qt会使用直接连接(Qt::DirectConnection);如果在不同线程Qt会使用队列连接(Qt::QueuedConnection)。 Qt::DirectConnection是一种直接连接方式,它会在发出信号的线程直接调用与之相连的槽函数。这种连接方式是最快的,因为没有信号和槽函数之间的介过程,但是需要注意的是,如果信号和槽函数在不同的线程,会导致线程安全问题。 使用Qt::DirectConnection连接信号和槽时,需要注意以下几点: 1. 信号和槽函数必须在同一线程。 2. 信号和槽函数的参数类型必须一致。 3. 如果信号和槽函数都是虚函数,必须使用Qt::DirectConnection连接,否则会导致无限递归。 下面是一个使用Qt::DirectConnection连接信号和槽的例子: ```c++ // 定义一个MyObject类 class MyObject : public QObject { Q_OBJECT public: MyObject(QObject *parent = nullptr) : QObject(parent) {} signals: void mySignal(int value); public slots: void mySlot(int value) { qDebug() << "mySlot called with value: " << value; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyObject obj1; // 在主线程创建一个对象 MyObject obj2; // 在主线程创建另一个对象 // 使用Qt::DirectConnection连接信号和槽 QObject::connect(&obj1, &MyObject::mySignal, &obj2, &MyObject::mySlot, Qt::DirectConnection); // 在主线程发出信号 emit obj1.mySignal(123); return a.exec(); } ``` 这段代码,我们在主线程创建了两个MyObject对象,然后使用Qt::DirectConnection连接了obj1的mySignal信号和obj2的mySlot槽函数。当在主线程发出mySignal信号时,mySlot槽函数会在主线程直接被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值