首页 > 其他分享 >QT信号与槽机制与事件机制的区别

QT信号与槽机制与事件机制的区别

时间:2024-03-11 14:46:37浏览次数:27  
标签:函数 对象 事件 信号 过滤器 机制 QT

QT信号与槽机制与事件机制的区别

第一:什么是信号与槽?事件?

    所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现,并不是 GoF 经典的观察者模式的实现方式。)

   事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。事件也就是我们通常说的“事件驱动(event drive)”程序设计的基础概念。事件的出现,使得程序代码不会按照原始的线性顺序执行。

第二:信号与槽的作用是什么?事件呢?

   信号与槽的是针对类对象来使用的,当一个对象有一个信号的动作时,通过信号槽的方式可以将此信号发送给connect关联的另一个类对象的槽函数。信号槽是线程安全的,同时对于信号和槽函数,他们的参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。一般来讲,信号槽在模块内进行使用。

  对于自定义信号,注意的是函数返回为void,同时不需要去实现它,QT的元对象系统会自动生成对应函数。而对于槽函数其实就跟不同函数一样,会受到public,private,protected的影响。

  事件其实也就是所谓的事件驱动,比如我们设计了一堆功能放在界面上,用户点击了“打开文件”,于是开始执行打开文件的操作;用户点击了“保存文件”,于是开始执行保存文件的操作。我们不知道用户究竟想进行什么操作,因此也就不能预测接下来将会调用哪一个函数。如果我们设计了一个“文件另存为”的操作,如果用户不点击,这个操作将永远不会被调用。这就是所谓的“事件驱动”,我们的程序的执行顺序不再是线性的,而是由一个个事件驱动着程序继续执行。没有事件,程序将阻塞在那里,不执行任何代码。

第三:信号/槽机制原理?事件机制的原理?

  首先需要了解元对象系统,为什么信号没有定义但却可以通过编译使用,原因就在于元对象系统,通过此,信号可以被定义,此时就已经知道信号的索引,通过此索引就能找到对应的槽函数。

事件机制通过使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt 的事件也可以不进入事件队列,而是直接处理。需要了解的是所有的事件都有一个事件处理函数,这时我们需要通过event进行事件的分发。当然也可以使用事件过滤器用来模拟一种系统根本没有那个事件的效果。

第四:什么场景下需要用到信号与槽,什么场景下用事件机制?

 信号槽一般用于模块内进行通信,对于不同的类对象之间的联动处理需要使用此机制。

事件机制往往用于以下几种情形:

重写paintEvent()、mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。
重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。
在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。
在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。
重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)。

原文链接:https://blog.csdn.net/u011006800/article/details/84582981

标签:函数,对象,事件,信号,过滤器,机制,QT
From: https://www.cnblogs.com/keleman/p/18066032

相关文章

  • 通达信涨停信号指标公式源码
    {通达信涨停信号指标公式源码}B1:=(HHV(H,9)-C)/(HHV(H,9)-LLV(LOW,9))*100-70; B2:=SMA(B1,9,1)+100; B3:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100; B4:=SMA(B3,3,1); B5:=SMA(B4,3,1)+100; B6:=B5-B2; B7:IF(B6>60,B6-60,0);持有:STICKLINE(REF(B7,1)<b7,b7,r......
  • 基于EXO λ驱动的可编程分子信号传输架构和DNA电路中的反应物再生策略四节点DNA电路与
    为了解决过程中信号衰减的问题,利用独特的环形空间拓扑结构和EXOλ的水解特性,实现了EDRR策略EXOλ的特性如图1a所示,当EXOλ水解底物,锥形通道的宽端,可以从5'的钝端或凹端嵌入DNA链,从而连续和快速水解,在5'端有磷酸修饰的DNA链,而互补链则从锥形中穿出通道。它的环形空间拓扑结......
  • 使用AT+MQTT指令连接华为云实现数据上传
    1准备工作硬件设备模块:ESP-01-S固件烧录工具:ESP8266下载器串口调试工具:VOFA+参考文章:stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与下发的命令处理2固件更新2.1为什么要重新安装固件由于ESP-01-S模块出厂没有集成MQTT指令,故需要自己下载固件包,详见官网固......
  • Java入门(向世界呐喊、Java运行机制、IDEA)
    Java入门1.HelloWorld!(向世界呐喊)新建文件夹用于存放代码(Code)->新建Java文件(Hello.java)->使用Notepad++进行编辑->在当前路径打开CMDpublicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("HelloWorld!"); }}注意:系统可能没有显示文件......
  • 通达信提前抄底部副图,粉红吸筹信号 绿色钻石抄底信号
    {通达信提前抄底部副图,粉红吸筹信号绿色钻石抄底信号}提前抄底部黄曲线是多方力度;{ 指标介绍:黄曲线是多方力度;绿色曲线是空方力度。红色背景是耻骨区间;绿色背景是持币区间。股东的一些基本资料可以显示在左侧查询。底部出现粉红色的柱体表示庄家在吸纳筹......
  • 通达信买卖区间信号指标公式源码副图
    {通达信买卖区间信号指标公式源码副图}A14:=MA(CLOSE,20);A15:=(CLOSE>MA(CLOSE,5));A16:=(MA(CLOSE,5)>MA(CLOSE,10));A17:=(CLOSE>MA(CLOSE,10));A18:=(MA(CLOSE,5)>MA(CLOSE,20));A19:=(CLOSE>MA(CLOSE,20));A10:=REF(A14,1);A11:=(A14>A10);AVX:......
  • 通达信主力进场副图指标公式信号简单清楚,毫不含糊
    {通达信主力进场副图指标公式信号简单清楚,毫不含糊}主力进场,信号简单清楚,毫不含糊,红柱表示准备拦住表示出手。源码{主力进场}VAR2:=REF(LOW,1);VAR3:=SMA(ABS(LOW-VAR2),3,1)/SMA(MAX(LOW-VAR2,0),3,1)*100;VAR4:=EMA(IF(CLOSE*1.2,VAR3*10,VAR3/10),3);VAR5:=LLV(L......
  • Qt ModbusTCP通讯
    前言Modbus在工业控制中的应用非常多,由于其免费使用加上一定的历史环境,Modbus在PLC上的通讯应用非常多,本文主要介绍MosbusTCPmaster(主站)的实现。一、关于ModbusModbus是由MODICON公司开发的一种工业现场总线协议标准,随后施耐德推出了基于TCP/IP的MOdbus协议:Modbustcp;......
  • Qt 使用第三方libmodbus库实现Modbus通讯
    之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。 经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。......
  • Qt 基于QTcpSocket的ModbusTCP协议
    一、编写缘由1.发现问题最近项目上要把之前的modbusRTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbuss......