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

时间:2017-07-21 04:47:54

标签: qt c++11 qml qt5

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

1

connect(sender, SIGNAL(mySignal()), receiver, [] { ... }); 通常更可取,并支持与lambda函数的连接。如果在编译时未定义对象类型,则{{1}}是唯一的选项。正是这种情况下,使用c ++中的QtQuick对象。

有没有办法按名称将信号连接到lambda函数?像

这样的东西
{{1}}

1 个答案:

答案 0 :(得分:-1)

不可能用Qt中的信号槽实现方式。可以从两个对象和信号和插槽可用的任何地方调用Connect。元对象(在moc生成的文件中定义)必须能够获得指向声明为slot的函数的指针,以添加指向事件表的指针。实际上甚至在lambda函数中捕获Qt对象可能是有害的,除非你通过引用捕获它们。 Qt不是围绕C ++ 11意识形态而设计的,更多的是,Qt库的容器实现了一个本质上是UB(未定义的行为):像“这大部分时间都有效”的评论暗示了这一点。

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

<div class="ajax" >
   <img src="https://www.w3schools.com/html/pic_mountain.jpg"/>
   <p>Hello, world!</p>
</div>

$(document).ready(function(){
    $.colorbox({inline:true, href:".ajax"});
});

但要注意Qt的哪个版本以及你正在使用它的范围,旧的Qt 5.x版本泄漏了:请参阅Qt leaks on connecting to lambda。并且只能连接到捕获全局范围对象的lambda,或者保证比callerObject更长寿的范围。