Qt QML 杂记

Qt 拾遗 002 connect

2020-04-04  本文已影响0人  赵者也

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 来避免重复连接
上一篇下一篇

猜你喜欢

热点阅读