qt 信号和槽
- 第五个参数
一般使用默认,不需特别指明
第五个参数 Qt::ConnectionType
Qt::ConnectionType 是一个枚举类型,用于指定连接的类型。以下是 Qt::ConnectionType 枚举的各个值及其含义:
Qt::AutoConnection(默认值):
如果发送者和接收者在同一个线程中,则使用 Qt::DirectConnection。
如果发送者和接收者在不同的线程中,则使用 Qt::QueuedConnection。
Qt::DirectConnection:
当信号被发出时,槽函数立即被调用,无论发送者和接收者是否在同一个线程中。
这意味着槽函数在发出信号的线程中执行。
Qt::QueuedConnection:
信号被放入事件队列中,槽函数在接收者的线程中执行。
适用于跨线程通信。
Qt::BlockingQueuedConnection:
类似于 Qt::QueuedConnection,但会阻塞发出信号的线程,直到槽函数执行完毕。
适用于跨线程通信,但需要注意性能影响。
Qt::UniqueConnection:
如果连接已经存在,则 connect 函数会返回 false,不会创建新的连接。
可以与上述任何连接类型组合使用,例如 Qt::UniqueConnection | Qt::QueuedConnection。
- 四个参数和三个参数
四个:connect(&send,&sendclass::signal,this,&class::slot);
三个:QObject::connect(reply, &QNetworkReply::finished, {
dosomething();
});
使用三个参数的connect注意事项:
一般使用【=】值捕获:
由于使用引用方式捕获对象会有局部变量释放了而Lambda函数还没有被调用的情况。
如果执行Lambda函数,那么引用传递方式捕获进来的局部变量的值不可预知。所以绝大多数场合使用的形式为: [=] () { }。
- 关闭槽链接disconnect()
disconnect(button, &QPushButton::clicked, this, &MyWidget::onButtonClicked);
在需要动态管理信号和槽连接的情况下。Qt 提供了多种方法来断开信号和槽的连接。
Qt 5 及以上版本
在 Qt 5 及以上版本中,推荐使用 QObject::disconnect 函数的重载形式,这样可以更安全地断开连接。
断开特定的信号和槽连接:
Cpp
深色版本
disconnect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);
例如:
Cpp
深色版本
disconnect(button, &QPushButton::clicked, this, &MyWidget::onButtonClicked);
断开所有从发送者到接收者的连接:
Cpp
深色版本
disconnect(sender, nullptr, receiver, nullptr);
例如:
Cpp
深色版本
disconnect(button, nullptr, this, nullptr);
断开所有从发送者到特定槽的连接:
Cpp
深色版本
disconnect(sender, nullptr, receiver, &ReceiverClass::slot);
例如:
Cpp
深色版本
disconnect(button, nullptr, this, &MyWidget::onButtonClicked);
断开所有从特定信号到接收者的连接:
Cpp
深色版本
disconnect(sender, &SenderClass::signal, receiver, nullptr);
例如:
Cpp
深色版本
disconnect(button, &QPushButton::clicked, this, nullptr);