首页 > 其他分享 >QT信号槽

QT信号槽

时间:2023-04-04 12:12:51浏览次数:40  
标签:函数 线程 connect 信号 Qt 连接 QT

目录

基础使用

  • 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
  • 所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
  • 其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
  • 一个信号可以连接多个槽,当信号发出时,会以不确定的顺序逐一调用槽函数
  • 信号可以连接信号,第一个信号发出后引起第二信号发出
  • 连接可以移除,因为在对象删除时会自动移除所以较少使用
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
  • 如果信号槽连接两次,那么信号发生时,槽函数将调用两次
  • signals前面不可加public、private和protected进行修饰;slots前面可以加,因为Qt说槽函数可以当普通函数使用
  • signals区域的函数必须是void类型,而且这些信号函数没有函数体,也就是说不可以自己定义这些信号函数
  • 宏定义和函数指针不能用于信号和槽的参数,信号和槽也不能有缺省参数

connect函数的第五个参数


注意问题

连接失败

信号槽发送不成功可能是connect连接失败了,connect返回true表示连接成功

  • 信号槽函数的参数类型或参数个数不一致,导致连接会失败
  • 信号槽函数经过SIGNAL() 与 SLOT() 转换宏包裹后再元对象系统中为字符串不会检查错误推荐QT5以上使用新的写法
  • 信号槽函数中消息类型没有注册在元对象系统,此时connect函数也会返回false。可以单步跟踪QT代码。注册消息需要添加类似qRegisterMetaType<QList<CDPSlaBaseInfo>>("QList<CDPSlaBaseInfo>");

跨线程使用

  • QT中跨线程推荐使用信号槽的方式传递信息,如果访问信息速度很频繁数据很大推荐用指针直接访问的方式。
  • 跨线程请指定连接方式Qt::QueuedConnection,调试QT4.8.6时发现跨线程connect默认应该是Auto跨线程也就是Qt::QueuedConnection的连接方式,connect返回成功但信息实际上并没有发送过去!指定Qt::QueuedConnection的连接方式连接后connect返回false,也就是说auto的连接并没有在跨线程中默认为Qt::QueuedConnection,所以最好手动指定。

设计模式思考

  • 信号槽代替了函数指针,用统一的方式实现了回调函数、对象间的消息的传递、跨线程的消息传递,使程序更简洁,是MVC设计模式的通信基础。
  • 但是在有些场景下,这样传递消息是比较麻烦的,而且过多的信号槽连接增加了程序调试的困难,过多的消息传递让MVC代码不够优雅。
  • React/redex前端的单一数据流结构属于发布订阅的设计模式,就很清晰不会漏发消息。

标签:函数,线程,connect,信号,Qt,连接,QT
From: https://www.cnblogs.com/wuya178/p/17285971.html

相关文章

  • MQTT再学习 -- 安装MQTT客户端及测试
    上一篇文章我们已经讲了MQTT服务器的搭建,参看:MQTT再学习--搭建MQTT服务器及测试接下来我们看一下MQTT客户端。一、客户端下载首先,客户端也有多种,我们需要面临选择了。参看:基于mqtt的消息推送(三)客户端实现现有客户端sdk分析,基本分为两大类:一类移植自C类库,如Mosquitto,一类是用o......
  • MQTT再学习 -- 漫谈MQTT协议
    MQTT服务器搭建我们已经完成了,现在回过头来看协议。参看:MQTT官网参看:MQTT_V3.1_Protocol_Specific参看:MQTT协议中文版参看:MQTT协议中文版上面这几篇文章,已经说明了一切。下面着重讲一下MQTT的消息格式和主要特征。一、什么是MQTT首先你要知道什么是MQTT。额,这个很重要。官网是......
  • kubernetes rabbimq3.11.11集群之mqtt插件
    1.概述本文是总结给予k8s的rabbitmq3.11.11集群的mqtt搭建rabbitmq集群搭建详见前一篇文章:kubernetes集群部署rabbimq3.11.112.自动创建mqtt账号密码wrapper-entrypoint.sh#!/usr/bin/envbash(sleep20;\admin_user=bbbbbb;\admin_passwd=111111;\rabbitmq......
  • 关于Qt 信号和槽的连接方式
    当一个信号连接多个槽时,信号发送时会,所有槽都会被调用。而断开连接则会从连接中删除指定的信号与槽的对应关系,该槽函数将不再接收来自信号的任何消息,直到它重新连接到信号。当一个connect()方法以QQueuedConnection连接不同线程的信号和槽时,如果线程被disconnect,则信号和槽......
  • 基于matlab的GPS信号相关检测算法仿真
    1.算法描述       全球定位系统(GlobalPositioningSystem,GPS),是一种以人造地球卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。GPS自问世以来,就以其高精度、全天候、全球覆盖、方便灵活吸引......
  • mqtt启用ssl参考(2)
    1.WefirstneedtoinstallOpenSSLinordertocreateourcertificatesandkeys.ClickhereforGitHuborherefortheexe.2.CreateCAkeypair:NavigatetotheWindowsstartandsearchOpenSSL.Hitenteron"OpenSSLCommandPromt".Makesurey......
  • vscode 配置qtdesigner和pyuic
    1、安装python扩展插件: 2、打开扩展设置: 3、配置Pyuic:Cmd与Qtdesigner:Path路径1为pyuic的位置,这里先自己试一下默认的情况下ui能不能编译成python代码,能就不用改,不能就更改为pyuic.exe位置。2为pyuic编译为.py文件的存放路径,如下为存放到当前ui文件所在目录,一般不做修改......
  • Qt音视频开发33-vlc和mpv打开后鼠标打圈圈问题的解决
    一、前言如果采用的vlc句柄模式,如果鼠标停留在句柄控件中会发现在打开后鼠标打圈圈,mpv句柄模式是在关闭后鼠标打圈圈,这两者真是一前一后,这种给人的体验其实很不友好的,播放开始后或者播放完成后鼠标指针居然变成了繁忙,但是当你将鼠标位置从句柄控件中移到外面的时候,他又会自动恢复......
  • emqtt使用Let's Encrypt配置mqtt开启ssl的问题(1)
    emqtt的wss直接在nginx这一层配置就好。配置mqtts的时候有点问题:原过程1.使用cerbot生成了证书:  2.挂载到emqtt容器  这里参考了一些资料:    后果是一直连接不上  然后就找原因:1)官方的常见问题:......
  • Qt学习笔记9——P30-33. 自定义控件封装,鼠标事件,定时器
    P30.自定义控件封装P31.Qt中的鼠标事件P32.定时器1P33.定时器2P30.自定义控件封装(创建了新项目) 添加新的界面和类:右键项目的文件夹(顶层的文件)->Qt——Qt设计师界面类->“选择界面模板”选"Widget"->在"Classname"中取个类名(此案例中改成了SmallWidget)->别的没......