QT - 了解SLOT的以下lambda表达式

Mis*_*tyD 4 qt

我目前正在尝试了解新的QT5信号/插槽语法

connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
       receiver->updateValue("senderValue", newValue);
   });
Run Code Online (Sandbox Code Playgroud)

现在我的问题是上面表达式中接收器SLOT的地址在哪里?我想知道这一点,因为如果信号在threadA中并且插槽位于线程B中并且我希望它是一个排队连接会发生什么?

Mat*_*Mat 7

一个插槽是一段代码,它不会在线程中"活动" - 一个线程可能会运行它,但代码本身不属于任何线程.(如果插槽是成员函数,那么定义为接收器的Qt对象属于Qt线程 - 这是对象的属性,而不是函数.)

在上面的代码中,编译器生成一个对象:

  • receiver按值捕获([=])
  • 有一个函数调用操作符,可以通过引用const QString来调用.

该对象connect与其他两个参数一起传递.它不是QObject,所以它没有Qt意义上的拥有线程.您需要确保的是:

  • receiver只要该信号连接,什么指向保持活着
  • receiver->updateValue(...)是线程安全的 - 它将在sender上下文/线程中调用.

如果receiver->updateValue需要在receiver线程/上下文中调用,则不要使用该语法进行connect调用,使用指定发送方和接收方的方法以及连接类型.