Qt: QObject::按名称将信号连接到 lambda



Qt中有两种类型的信号/时隙连接语义:

connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot())); // 1
connect(sender, &MySender::mySignal, receiver, &MyReceiver::mySlot); // 2

2通常更可取,并支持与 lambda 函数的连接。如果在编译时未定义对象类型,则1是唯一的选项。使用来自 c++ 的 QtQuick 对象正是这种情况。

有没有办法按名称将信号连接到 lambda 函数?类似的东西

connect(sender, SIGNAL(mySignal()), receiver, [] { ... });

不,这在Qt中如何实现信号槽是不可能的。 连接可以从任何有两个对象、信号和插槽可用的地方调用。元对象(在 moc 生成的文件中定义(必须能够获取指向声明为 slot 的函数的指针,以添加指向事件表的指针。实际上,即使在lambda函数中捕获Qt对象也可能是有害的,除非您通过引用捕获它们。Qt不是围绕C++11意识形态设计的,更多的是,Qt库的容器具有本质上是UB(未定义行为(的实现:像"这在大多数情况下都有效"这样的评论暗示了这一点。

您可以尝试使用 QObject::connect 函数连接到 lambda:

QObject::connect(callerObject, &callerObject::signal, [ ] {...})

但要注意Qt的哪个版本以及你在哪个范围内使用它,旧的Qt 5.x版本泄露了:请参阅连接到lambda时的Qt泄漏。并且只能连接到捕获全局作用域对象的 lambda,或者确保比 callerObject 生存时间更长的作用域。

相关内容

  • 没有找到相关文章

最新更新