信号和槽

翻译 2017年10月02日 14:34:16

信号和槽
信号和槽用来实现对象之间的通信。信号和槽机制是qt的核心机制。其由Qt的元对象系统实现。
介绍
在GUI编程中,我们希望通过改变一个组件来通知另一个组件。通常我们想要一个对象与另一个对象通信。例如,如果一个用户点击了一个Close Button,则我们想要一个窗口close被调用。
其他的工具包通过回调来实现通讯。一个回调是一个函数指针,所以,如果你必须向处理函数发送指针来通知函数某个事件发生。接着处理函数调用回调函数。尽管许多成功的框架使用这种方法,但是回调函数并不是非常直观而且可能在确保回调参数的类型正确上面临问题。

信号和槽
在qt,使用了改进的回调技术:我们使用信号和槽。当一个事件发生时,就会发送信号。qt组件有许多预定义好的组件,我们也可以子类化它们来添加自己的信号。槽是一个用来响应信号的函数。qt组件也预定义了许多槽,可以通过过子类化它们添加自己的槽。
这里写图片描述
信号和槽是类型安全的:信号的签名必须匹配槽的签名。(实际上槽的签名可能短于信号的签名,因为它可能会忽略掉额外的参数)因此,签名是兼容的,编译器可以帮助我们检测基于指针语法的函数的不匹配。基于字符串语法的SINGAL和SLOT,会在运行时检测其类型是否匹配。信号和槽是松耦合。发送信号的类不知道也不关心是谁来接收信号。当连接了一个信号和槽,信号和槽机制,将确保槽在正确的时间被调用。信号和槽可以携带任何数量,任何类型的参数。它们是完全类型安全的。
所有集成QObject及其子类的类都可以包含信号和槽。发送信号的类并不知道是否有对象接受信号。这是一个正确的信息封装,并且确保可以把对象封装成一个组件。
槽可以接收信号,而且它们是普通的成员函数。仅仅作为一个对象并不会知道是否有对象接收它的信号,槽也不知道是否有信号会连接它。这确保了被qt创建的组件是独立的。
可以连接许多信号到槽,槽一个可以被多个信号连接。直接连接两个信号也是可以得。(当第一个信号触发时,将会立即发送两个信号)。

信号
信号定义成公共访问权限,可以在任何地方发送它,但强烈建议在包含他的类及其子类中发送它。
通常,信号发送时连接它的槽会立即执行,这种情况下,信号和槽通常独立于GUI事件循环。代码中跟随在emit声明后的代码会在所有槽返回后执行一次。当使用 queued connections时,情况会有些不同,在emit关键字声明后的代码回持续执行,slots稍后执行。
如果一个槽被多个信号连接,它会根据connect的顺序依次执行。
信号有moc自动产生,切没有有返回类型。
如果不使用特殊类型,信号和槽大部分可重复使用。

槽是不同的成员函数,然而不管访问权限如何,可以被任何组件调用。
可以将槽定义成虚拟函数。
相较于回调函数,信号和槽由于其要实现灵活性,所以从发送信号到槽,大约慢10倍左右,不包括虚函数调用。但是为了灵活性和简单性这些耗费都是值得的。
注意,如果信号和槽调用了其他库中的变量可能会产生警告或错误,为了解决这个问题,#undef 这些不和规则的预处理符号。

QT 信号与槽不在同一个线程 connect

主线程中发出一个信号,另一个线程槽函数没有响应,这个问题搞了好几个小时,才发现原来是connect时候的第5个参数写错了,在这里做下备注吧。 connect用于连接qt的信号和槽,在qt编程过程...

Qt跨线程信号和槽的连接

文章来源:http://blog.csdn.net/seanyxie/article/details/7025183 Qt支持三种类型的信号-槽连接: 1,直接连接,当signal发射时,slot...

PyQt5(4)——控件事件响应与信号槽

事件(Events)是 GUI 程序中很重要的一部分,它由用户操作或系统产生。当我们调用程序的 exec_()方法时,程序就会进入主循环中。主循环捕获事件并将它们发送给相应的对象进行处理。 为此,Qt...

QT学习(一) 入门:基本控件和信号与槽和练习

这两天需要用到QT写一个界面,决定去学。Qt Create这个IDE真是非常好用,轻量级,Ui设计界面拖拖控件就行了,再用信号与槽(signal and slot)的机制就能很轻松的将界面上的一些事件...

【QT】深入qt信号与槽实现原理

1、先上示例代码先上示例代码直观地感受一下qt信号与槽的用法,后面再详细解释。通过QtCreator创建一个Qt Widget工程(没有创建ui文件,其它选项为默认值),工程名为SS,最后在SS目录下...
  • iEearth
  • iEearth
  • 2017年07月01日 05:19
  • 2385

从零开始实现信号槽机制:二

到这里应该差不多了,总结一下。我们在上篇博文中实现的sigslot机制已经能够比较好地实现两个组件之间的解耦,但是缺点是设计库时需要针对不同参数数量的信号与链接需要重复编码,槽函数必须继承一个共同的基...

信号(Signal)与槽(Slot)-Qt中的典型机制

因为下一篇关于Boost的文章会涉及到事件处理的问题,里面用的是信号和槽的机制,先拿Qt里的这个机制预研一下。诶,Boost这是够厉害的,什么先进就包含什么!要知道我以前一直以为这是Qt的专利呢。当然...
  • JuanA1
  • JuanA1
  • 2011年07月25日 22:09
  • 13768

关于Qt中信号和槽的Connection

本文主要对我翻译的那篇博文中关于connection的建立过程做一些补充说明(那篇博文在这儿:http://blog.csdn.net/newthinker_wei/article/details/2...

QML中信号槽机制的使用

QT的最大特点就是信号槽了,自然QML也必须支持。不过呢,稍微会有些不同,比较语言不同了嘛。 QML中信号槽连接有三种方式: 第一种我们已经使用过了,就是类似onclicked这样的。 比如下面的代码...

Qt Creator 和在 vs2010 里 怎么添加信号和槽

Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了。 如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函数(在qt...
  • hapure1
  • hapure1
  • 2016年07月11日 15:47
  • 3797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:信号和槽
举报原因:
原因补充:

(最多只允许输入30个字)