Qt 拾遗 002 connect

Qt 拾遗 002 connect

connect 的完整定义形式如下:

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

信号与槽连接的几种主要体式

体式一

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

体式二

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

体式三

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

体式四

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
        socket->write("GET " + page + "\r\n");
    });

对于 connect 的前四个参数一般我们都很属性,就不做过多说明。这里主要记录一下第五个参数的一点说明。

枚举 Qt::ConnectionType 类型的多个值,主要用于设定信号和槽之间的连接类型,在实际开发中,我们可以使用这个参数设定一个信号的消息是否立即发送给槽,还是排队等候。

参数 说明
Qt::AutoConnection 默认值,自动关联,使用这个值时,连接类型会在信号发送时决定。如果接受者和发送者在同一个线程,则自动使用 Qt::DirectConnection 类型。如果接收者和发送者不在一个线程,则自动使用 Qt::QueuedConnection 类型
Qt::DirectConnection 直接关联。槽函数会在信号发送的时候直接被调用,只有槽执行完成并返回后,发射信号处之后的代码才会继续执行,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用槽函数。这样的操作在多线程中使用是比较危险的,可能造成崩溃
Qt::QueuedConnection 队列关联。槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在的线程。发送信号之后,无论槽函数执行与否,发射信号处之后的代码都会立即执行。此时槽函数不会立刻调用,而是等到接收者的当前函数执行完毕,进入事件循环之后,槽函数才会被调用。多线程环境下,一般使用这个参数
Qt::BlockingQueuedConnection 阻塞队列关联。槽函数的调用时机与 Qt::QueuedConnection 是一样的,不过发送完信号后发送者所在的线程会阻塞,直到槽函数运行完并返回。接收者和发送者绝对不能在一个线程中,否则程序会死锁。在多线程间需要同步的场合可能需要这个参数
Qt::UniqueConnection 唯一关联。这个 flag 一般通过使用(|)与上述四个参数结合使用。当设置这个 flag 时,如果信号和槽已经进行过连接,再进行重复连接就会失败。也就是说,我们可以使用这个 flag 来避免重复连接
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 引自:https://blog.51cto.com/9291927/2070398 Qt高级——Qt信号槽机制源码...
    Magic11阅读 4,473评论 1 12
  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 1,451评论 0 6
  • 一、问题 学习Qt有一段时间了,信号槽用的也是666,可是对信号槽的机制还是一知半解,总觉着不是那么得劲儿,万一哪...
    行走的代码阅读 1,202评论 0 5
  • 这篇文档从使用到实现去讲信号-槽,适合小白到使用一两年的。对于Qt使用而言,信号-槽是我们津津乐道的一个功能,那我...
    开发呆呆阅读 2,374评论 0 0
  • 1、概述 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检...
    你的社交帐号昵阅读 45,876评论 0 9

友情链接更多精彩内容