【Qt】信号和槽(三) (断开连接和lambda函数)

信号与槽断开连接

使用disconnect函数,与connect的用法类似。

示例:

按过按钮二后:

实际开发中disconnect的使用较少,大部分情况是把信号和槽连接好后就不再关心。这里用disconnect的场景是主动断开当前信号所连接的槽函数,然后信号再重新连接绑定到另一个槽函数上。

若不断开,则会有两个日志的打印。

lambda表达式定义槽函数

lambda表达式本质是一个匿名函数,主要在回调函数中进行使用。通常是一次性的,也可以用auto识别函数类型,延长生命周期进行调用。

示例:

ambda除了可以按照传值捕获button,=的方式捕获变量,还能按照传引用捕获\&的方式捕获变量,但Qt中很少用传引用的方式=,因为在Qt中捕获的变量一般是各种控件的指针,指针变量传值或传引用都可以。按引用捕获有致命 问题。

按引用捕获的变量,需要关注其生命周期。例如,局部指针变量 button 在构造函数结束时就被销毁,可能被置为 nullptr。若 lambda 按引用捕获了 button,构造函数结束后 button 已为空。此时用户点击按钮触发 lambda,访问空指针会导致程序崩溃。

因此,按引用捕获风险大。按值捕获会拷贝指针指向的堆地址,即使外部指针被置空,lambda 内部的拷贝仍然有效。实际开发中,建议尽量使用值捕获。

相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能13 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G13 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt