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 来避免重复连接 |