python qtdesigner 槽_第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用...

1、引言

前面一些章节其实已经在使用信号和槽了,可是做为Qt中最重要的机制也是Qt区别与其余开发平台的重要核心特性,仍是很是有必要单独介绍。web

2、信号和槽的概念

2.一、概述

信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可让互不干扰的对象创建一种联系。svg

信号和槽用于对象间的通讯,在一个图形界面程序中,当一个部件中发生变化时,一般须要通知其余对象,在Qt中当采用特定事件发生时会发射(注意此处用的是发射(emit)而不是发送,老猿估计是由于这里的信号不是一对一发送的,而是能够一对多发射)一个信号来通知须要通知的对象,须要关注的对象就会调用信号链接的槽函数执行响应操做。函数

从QObject或其子类(如QWidget)继承的全部类均可以包含信号和插槽。布局

2.二、信号(signal)

当对象以其余对象可能感兴趣的方式改变其状态时,它们会发出信号。学习

Qt中的信号本质上是一个公有函数(即方法),信号只需声明,不能对其进行定义,声明函数时不能有返回值。因为信号是某个对象的公有方法,信号能够从任何地方经过emit语句发出,与直接调用信号对应函数相似,只是在函数调用语句前多了个emit。.net

发射信号的语句:emit 信号函数(信号参数)设计

Qt建议只从定义信号的类及其子类的类发出信号,Qt中的部件(又称为控件、组件)都有一些预约义的信号,如按钮的clicked()信号。信号发出方不知道也不关心是否有对象在接收它发出的信号3d

2.三、槽(slot)

槽能够用来接收信号,但槽也是部件派生类的正常成员函数,槽本质上是某个类的方法(包括虚方法),用来调用以响应特定信号,非虚函数的槽函数也能够正常调用,与普通成员方法的惟一的区别是信号能够链接到它们。指针

因为槽是普通成员方法,因此当直接调用时,它们遵循正常的成员方法调用规则。可是,做为槽,它们能够由任何组件经过信号链接调用,无论槽函数的访问级别是公开仍是私有,信号的发射者无需知道哪些对象会执行槽函数响应它发射的信号(老猿认为因为Python的封装机制,这点在PyQt中意义不大)。code

就像一个对象不知道是否有任何东西接收到它的信号同样,槽也不知道是否有任何信号链接到它。

2.四、处理信号

处理信号一般的作法是对可视部件进行子类化并添加对应的槽,以便处理感兴趣的信号。

当信号发

出时,一般与之相连的槽像正常的函数调用同样会当即执行,全部槽都返回后,将执行信号发出的emit语句后面的代码。但在信号和槽链接使用队列链接(connect函数的type参数值为Qt.QueuedConnection,使用Qt Designer定义的信号和槽链接经过PyUIC生成的代码不会使用该值)时状况略有不一样,在这种状况下,emit关键字后面的代码将当即继续,槽将在稍后执行。

若是多个槽链接到一个信号,则当信号发射时,槽函数将按照创建链接的顺序依次执行。

与其余平台用于对象间通讯的回调函数机制相比,信号和槽的机制稍微慢一些,发射与某些槽相连的信号,比用槽函数直接调用响应慢约十倍(不考虑槽函数自己的执行时间,只是从信号发射到槽函数开始执行的时间),但这种机制提供的灵活性增长了。

注意:

槽函数可能与多个对象的多个信号链接,有时代码须要判断信号是哪一个对象发送的,此时可使用在槽函数中使用sender()函数获取信号的发送对象来进行不一样的处理。具体可参考:《PyQt学习随笔:槽函数获取信号发送对象的方法》

2、信号和槽的特色

2.一、信号和槽的参数必须匹配

Qt的signal s和slots机制确保,若是将一个信号链接到一个slot,该slot将在正确的时间使用信号的参数调用。在Qt中,信号和插槽能够接受任意数量的任何类型的参数,但老猿认为在PyQt中可能存在一些限制。

信号和槽的参数必须匹配体如今如下方面:

信号和槽的签名(英文原文是signature,老猿理解签名就是所带的参数)必须匹配,槽的参数能够少于信号的参数数量,由于槽函数能够忽略额外的参数,槽的参数不能多余信号的参数,由于若槽的参数更多,则多余的参数不能接收到信号传递过来的值,若在槽中使用了这些多余的无值的参数,就会产生错误;

信号和槽的参数类型必须匹配,在Qt Designer中进行信号和槽编辑时定义槽函数时必须带参数类型;

因为Qt是C++语言的平台,信号的参数类型都是C++类型的,可能存在部分参数类型Python没法使用的状况,这种状况老猿在学习中遇到过但没记录下来,也没有专门研究,但绝大多数类型特别是标准的C++类型能够支持;

Python没有指针以及引用类型,这两种信号带的参数在信号和槽函数编辑时槽函数参数必须是指针以及引用类型,但在派生类实现槽函数时将其当成去掉指针或引用的类型。例如,QAbstractButton *类型在实现槽函数时应该做为QAbstractButton 类型处理。

2.二、信号和槽是松耦合的

这种松耦合表如今发出信号的对象既不知道也不关心哪一个槽接收信号,槽也不知道有哪些信号链接到它。从某种程度上讲,信号和槽是相似电视节目和观众之间的关系。电视节目播放相似于信号发射,观众观看节目相似于槽,观众选择本身感兴趣的节目观看就是创建信号与槽的链接。

2.三、信号和槽之间是多对多的关系

可将多个信号链接到同一个槽

可将同一个信号链接到多个槽

能够将一个信号直接链接到另外一个信号(这将在第一个信号发出时当即发出第二个信号)

下图是官网文档给出的信号和槽的对应关系示例:

3da97f08f4d697f6ed35fdfe0181cdda.png

2.四、信号和槽支持预约义和自定义匹配

因Qt在其类库中预约义了不少信号和槽,所以在Qt中能够仅使用Qt类库中预约义的信号和槽,也能够只使用Qt类库中预约义的信号而使用自已的槽,也可使用Qt类库中预约义的槽来响应自已定义的信号,固然,槽和信号也均可以使用自定义的( 关于自定义信号本节不进行进一步探讨)。

2.五、能够断开信号和槽之间的链接

在信号和槽链接以后,connect方法会返回一个QMetaObjec.Connection类型的链接句柄,经过该句柄调用 disconnect()就能够断开信号和槽的链接。

3、Qt Designer中信号和槽操做

3.一、概述

在Qt Designer中能够自定义信号,但本节只介绍使用已有信号的操做方法。

3.二、槽函数的定义

要定义一个新的槽方法,经过Edit->Edit Signals/Slots或F4快捷键进入信号和槽编辑界面,如图:

d9f8a6caa278af5c39854ba367f1651f.png

进入编辑界面后双击要新增槽函数的部件或者从发射信号的部件开始使用鼠标画链接线,线的终点为槽函数所在部件(通常在窗口对象),释放鼠标后调出配置界面,如图为从pushButton发出信号到窗口的槽函数创建链接的案例:

11063711132a7ba9fa6517eb32ba7324.png

点击上图中蓝色标记的Edit按钮,如图:

31e413078c64ef7326c1f76b27670938.png

点击上图中的加号就能够增长新的槽函数。

注意:

在此定义槽函数须要输入槽函数名和各参数类型,不能输入参数名

参数类型只能是C++的通用类型和Qt支持的类型,不能是Python独有的类型

对已有的自定义槽函数能够经过鼠标双击进行编辑

3.三、信号和槽函数链接方法1

进入信号和槽的编辑界面后,能够经过鼠标在编辑界面右侧的信号列表中选择对应信号,在槽函数列表中选择对应槽函数,点击OK保存退出,就完成了信号和槽函数的链接创建。如图:

1d3ef6cab8ba15ada6d3cde74199bc07.png

注意:

上图黄色荧光笔标记部分,若是要选择Qt对应部件预约义的槽函数,必须对该选项进行勾选

在进行信号和槽编辑的时候,须要注意若是窗口使用了布局部件全被覆盖了窗口表面区域,可能致使没法使用本方法进行信号和槽的链接编辑,请参考:《PyQt(Python+Qt)学习随笔:Designer中不能编辑信号和槽的问题》

在Qt Designer中若是带不一样参数的同名信号如clicked()和clicked(bool)信号链接到名字相同但参数不一样的槽函数会致使两者最终会执行同一个槽函数,具体请参考:《PyQt(Python+Qt)学习随笔:clicked和clicked(bool)信号链接同名函数出现的问题》

3.四、信号和槽函数链接方法2

除了3.3部分介绍的信号和槽函数的链接方法以外,还能够在Designer右侧的信号和槽函数编辑界面进行信号和槽函数链接。如图黄色荧光笔标记窗口:

faa95734fa5f4e9dc828a0f21d8e9e2c.png

点击下面蓝色标记的加号,新增一条能够编辑记录,选择每一个字段鼠标双击进行编辑,如图:

b82198fb8c9bb8a5efacf91dc74b7ea3.png

退出编辑状态后相关链接自动保存。

这种方式与第一种方式相比,有以下不一样:

第一种方式直接使用链接线相似绘制线条同样操做,相比第二种方式操做简单、链接显示直观,但当界面线条过多杂乱时反而不如第二种方式操做方便

第二种方式能够将一些不可见的对象如Action对象在编辑界面进行操做,而第一种方式则不行

小结

本节详细介绍了Qt中信号和槽的概念,同时详细阐述了PyQt中与Qt中使用的一些差异,并详细介绍了Qt Designer中的操做方法,有助于你们深刻理解信号和槽的概念,并熟练使用。

f587566853c4276a1c5bf6a796b3a750.png

老猿Python,跟老猿学Python!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值