Python深度学习实战PyQt5信号与槽的连接
⽬录
1. 信号与槽(Signals and slots)
1.1 信号与槽的原理
1.2 信号发送者与槽的接收者
2. QtDesigner 建⽴信号与槽的连接
2.1 信号与槽的连接:不同的发送者与接收者,槽函数为控件的内置函数
QtDesigner 设置信号/槽的连接的操作步骤如下:
2.2 信号与槽的连接:不同的发送者与接收者,槽函数为⾃定义函数
QtDesigner 设置信号/槽的连接的操作步骤如下:
2.3 信号与槽的连接:相同的发送者与接收者,槽函数为控件的内置函数
2.4 信号与槽的连接:发送者是动作对象
3. 图形界⾯的主程序
3.1 从⾯向过程到⾯向对象
⾯向过程的程序设计
⾯向对象的程序设计
3.2 ⾃定义槽函数
1. 信号与槽(Signals and slots)
信号与槽机制是 PyQt 的核⼼机制,⽤于对象之间的通信,也就是实现函数之间的⾃动调⽤。
1.1 信号与槽的原理
简单地说,将信号与槽函数连接后,当信号被触发时,槽函数将被⾃动调⽤。
分析这个过程,涉及到⼏个基本概念和关系:
信号:信号可以是⼀个动作,也可以是对象的⼀种状态,⽤于触发所连接的槽。
槽:槽就是⼀个函数,可以由连接的信号触发。
发射信号:信号被发射时,⾃动调⽤信号连接的槽函数。通常,在对象的状态改变时发射信号。
信号可以带有参数,但必须与槽函数的参数相对应。
⼀个信号可以连接多个槽函数,多个信号也可以连接到⼀个槽函数。
⼀个信号可以连接到另⼀个信号上。
很多窗⼝部件(控件)内置了⼀下信号和槽,可以直接调⽤。也可以按需求⾃定义信号和槽。
1.2 信号发送者与槽的接收者
信号的发送者通常是⼀个控件对象,在控件对象的状态发⽣变化时发送信号。常见的发送者是图形窗⼝中的各种控件对象,但也可以是动作对象。
槽的接收者通常也是控件对象。槽函数是⼀个⾃定义的槽函数,或控件内置的槽函数。⼀般地,槽函数也有⼀个对象作为主体,即对于接受者这个控件对象执⾏函数定义的操作。例如槽函数执⾏的功能
是关闭,哪么究竟是关闭那个控件呢?关闭对象就是接受者。
django怎么学为了⽅便讲解信号与槽的连接,我们⽤ QtDesigner 在上节设计的图形窗⼝ uiDemo3.ui 的基础上,增加⼏个按钮对象和⽂本⾏编辑对象:
打开 PyCharm,从 Tools -> ExternalTools -> QtDesigner 打开 QtDesigner,打开 uiDemo3.ui ⽂件。
⿏标点击选中 QtDesigner 左侧控件栏 Buttons 中的 PushButton,按住⿏标不放,将其拖动到中间的图形界⾯后松开⿏标,就在图形界⾯中创建了⼀个 PushButton 控件。
⿏标点击选中 QtDesigner 左侧控件栏 InputWidget 中的 LineEdit,按住⿏标不放,将其拖动到中间的图形界⾯后松开⿏标,就在图形界⾯中创建了⼀个 LineEdit 控件。
重复以上步骤,再建⽴⼏个 PushButton 控件和 LineEdit 控件。
注意在 QtDesigner 右侧 “对象查看器” 中所显⽰的控件名称和属性,多个 PushButton、LineEdit 被⾃动赋予不同的命名(objectName),如:LineEdit_1、LineEdit_2、LineEdit_3,这就如同桌⼦有⼏个抽屉分别标记为 “抽屉1”、“抽屉2”、“抽屉3” 以便识别。
控件的名称和其它属性都可以在 “属性编辑器” 中编辑修改。
⿏标选中在图形界⾯中创建的 PushButton 控件或 LineEdit 控件,可以拖动控件调整位置。
⿏标双击 PushButton 按钮,可以编辑按钮控件的标签即按钮上的显⽰内容。
为了便于讲解,本例将各 PushButton 控件的显⽰内容(text 属性)修改为:“1# 按钮” ~ “4# 按钮”,将各 LineEdit 控件的显⽰内容(text 属性)修改为:“⽂本编辑⾏-1” ~ “⽂本编辑⾏-3”。
将这个应⽤程序图形界⾯另存为 uiDemo4.ui,其预览效果如下:
2. QtDesigner 建⽴信号与槽的连接
2.1 信号与槽的连接:不同的发送者与接收者,槽函数为控件的内置函数
QtDesigner 提供了便捷和直观的信号/槽编辑⽅法。
本例介绍不同的发送者与接收者,槽函数为控件的内置函数的操作⽅法。不同类型的控件分别内置了若⼲⽅法,例如QPushButton 控件内置的⽅法包括:点击、选中、状态变化、显⽰菜单等,⽽ QLineEdit 控件内置的⽅法包括:清空、复制、剪切、粘贴、全选、撤销操作等。使⽤控件内置的⽅法作为槽函数,可以直接调⽤,不需要对函数进⾏定义。
我们所设计的功能是:当点击按钮控件 “pushButton_1” 时,清空⽂本编辑控件 “lineEdit_1” 的显⽰内容。注意我们称按钮控件为 “lineEdit_1” ⽽不是 “⽂本编辑⾏-1”,这是因为 lineEdit_1 才是控件名称,在程序中是不变的,⽽ “⽂本编辑⾏-1” 只是显⽰内容,可以在程序中修改。
QtDesigner 设置信号/槽的连接的操作步骤如下:
(1)选择菜单项 “Edit” -> 编辑信号/槽,或者通过快捷键 F4 或在⼯具栏选择,进⼊信号/槽编辑模式。
(2)选中控件对象发送者,此处为按钮控件 “pushButton_1”,⿏标左键长按不放,该按钮控件变为浅红⾊。
⿏标左键继续长按不放,并移动⿏标,当⿏标移出控件对象区域后,出现⼀条带箭头的红线和⼀个红⾊的接地符号。
⿏标左键继续长按不放,并拖动⿏标到控件对象 “lineEdit_1”,松开⿏标左键,就建⽴了以控件对象 “pushButton_1” 为
发送者、控件对象 “lineEdit_1” 为接收者的信号/槽连接。
此时控件对象 “pushButton_1” 和 “lineEdit_1” 都变为浅红⾊,带箭头的红线从 “pushButton_1” 出发,指向 “lineEdit_1”
结束。
(3)同时弹出对话框 “配置连接 - QtDesigner”,对话框的左侧显⽰发送者控件的信号选项,对话框的右侧显⽰接收者的控件选项。
根据功能要求,触发信号为按钮 “pushButton_1” 被点击,从对话框左侧选中 “clicked()”;
根据功能要求,收到信号后动作是清空⽂本编辑控件 “lineEdit_1”,从对话框右侧选中 “clear()”;
点击对话框下⽅的按钮 “OK”,完成该信号/槽连接的配置。
2.2 信号与槽的连接:不同的发送者与接收者,槽函数为⾃定义函数
本例介绍不同的发送者与接收者,槽函数为⾃定义函数的操作⽅法。
在 2.1 中介绍了使⽤控件内置的⽅法作为槽函数,可以直接调⽤,不需要对函数进⾏定义。程序设计中的核⼼功能通常是程序员根据需求开发的⾃定义函数。使⽤⾃定义函数作为槽函数,⼀⽅⾯当然是要编写⾃定义函数,另⼀⽅⾯要将⾃定义函数添加到槽函数配置连接表中。
我们所设计的功能是:
当点击按钮控件 “pushButton_2” 时,清空⽂本编辑控件 “lineEdit_2” 的显⽰内容,并显⽰⽂本信息 “current signal: click pushButton_2”。
在主程序中要编写⼀个⾃定义函数实现该功能,将该⾃定义函数命名为 click_pushButton_2()。
注意我们编写的⾃定义函数 click_pushButton_2(),虽然功能只是对⽂本编辑控件 “lineEdit_2” 进⾏操作,但对于⾃定义函数也可以完成任意的其它功能,对其它控件按照控件名称进⾏操作。因此该槽函数的接收者并不是⽂本编辑控件 “lineEdit_2”,⽽是主窗⼝控件 “MainWindow”。
QtDesigner 设置信号/槽的连接的操作步骤如下:
⾸先要在 QtDesigner 将⾃定义函数添加到槽函数配置连接表中——⾮常重要。
⽹上的很多⽂章都没有讲具体实现⽅法,这个操作的⼊⼝也很难到。
(1)在 QtDesigner 右侧上⽅的 “对象查看器”,选中 MainWindow 或其它顶层对象,单击⿏标右键唤出下拉菜单,选择 “改变信号/槽”;
弹出 “MainWindow 的信号/槽” 对话框,对话框的上⽅显⽰槽的选项,下⽅显⽰信号选项。
点击对话框上⽅ “槽” 选项框下部的绿⾊ “+”,系统在 “槽” 选项表的最后⾃动增加了⼀⾏ “slot1()”。这就是新增的⾃定义槽函数。
点击选中 “slot1()”,再⿏标双击,就可以修改槽函数的函数名,例如修改为 click_pushButton_2()。
再点击对话框上⽅ “槽” 选项框下部的绿⾊ “+”,可以继续逐⼀添加⾃定义的槽函数。
然后设置信号/槽的连接:
(2)选择菜单项 “Edit” -> 编辑信号/槽,或者通过快捷键 F4 或在⼯具栏选择,进⼊信号/槽编辑模式。
选中控件对象发送者,此处为按钮控件 “pushButton_2”,长按⿏标左键并移动,当⿏标移出控件对象区域后,出现⼀条带箭头的红线和⼀个红⾊的接地符号。
松开⿏标左键,就建⽴了以控件对象 “pushButton_2” 为发送者、控件对象 “MainWindow” 为接收者的信号/槽连接。此时控件对象 “pushButton_2” 变为浅红⾊,带箭头的红线从 “pushButton_2” 出发,并不指向其它控件,⽽是以⼀个接地符号结束。
(3)同时弹出对话框 “配置连接 - QtDesigner”,对话框的左侧显⽰发送者控件 “pushButton_2” 的信号选项,对话框的右侧显⽰接收者 “MainWindow” 的控件选项。
根据功能要求,触发信号为按钮 “pushButton_2” 被点击,从对话框左侧选中 “clicked()”;
对话框右侧接收者 “MainWindow” 的控件选项列表中,显⽰了刚才添加的⼏个⾃定义函数,选择
“click_pushButton_2()”;
点击对话框下⽅的按钮 “OK”,完成该信号/槽连接的配置。
最后,别忘了要在主程序中编写⾃定义的函数。但这已不属于 QtDesigner 设计的内容了,在此不再详述。
类似地,我们设计:当点击按钮控件 “pushButton_3” 时,在⽂本编辑控件 "lineEdit_1"显⽰当前系统⽇期,在⽂本编辑控件"lineEdit_2"显⽰当前系统时间,在⽂本编辑控件 “lineEdit_3” 显⽰提⽰信息。在主程序中编写⼀个⾃定义函数
click_pushButton_3(),并与 “pushButton_3” 建⽴信号/槽连接。
这表明:在⾃定义的⼦函数中,可以同时操作多个控件对象,进⽽可以实现⽤户定义的各种功能。
2.3 信号与槽的连接:相同的发送者与接收者,槽函数为控件的内置函数
本例介绍相同的发送者与接收者,槽函数为控件的内置函数的操作⽅法。
顾名思义,相同的发送者与接收者,就是说信号的发送者与槽函数的接收者是同⼀个控件对象。这是什么情况?例如,⼀个开关按钮有 “On/Off” 两种状态,每按⼀次则按钮状态发⽣翻转。类似地,选项框也有选中、未选中两种状态。特殊地,点击按钮后,关闭该按钮控件,也属于相同的发送者与接收者。
我们⾸先将控件对象 “pushButton_4” 从按钮控件 QPushButton 改变为选项框控件 “QCheckBox”:
点击控件对象 “pushButton_4”,控件对象的周围边界显⽰⼏个蓝⾊⼩⽅块;
点击⿏标右键唤出下拉菜单,选择:“变型为” ->“QCheckBox”。
此时,设计界⾯窗⼝中的按钮控件,变成了⼀个选项框。同时,右侧 “对象查看器” 中的控件 “pushButton_4”,也⾃动变更为“checkBox_4”。变更的控件 “checkBox_4” 继承了原来控件 “pushButton_4” 的⼀些属性,如:位置、尺⼨、显⽰内容。
接下来设置信号/槽的连接:
(1)选择菜单项 “Edit” -> 编辑信号/槽,或者通过快捷键 F4 或在⼯具栏选择,进⼊信号/槽编辑模式。
(2)选中控件对象发送者,此处为按钮控件 “checkBox_4”,长按⿏标左键并移动,当⿏标移出控件对象区域后,出现⼀条带箭头的红线和⼀个红⾊的接地符号。
长按⿏标左键,拖动⿏标再回到控件对象 “checkBox_4” 区域后松开⿏标左键,就建⽴了发送者和接收者都是控件对象“checkBox_4” 的信号/槽连接。
此时控件对象 “checkBox_4” 变为浅红⾊,带箭头的红线从 “checkBox_4” 出发,⼜返回到 “checkBox_4” 结束。
(3)同时弹出了对话框 “配置连接 - QtDesigner”,对话框的左侧和右侧分别是控件对象 “checkBox_4” 的信号和槽函数。
从对话框左侧选中 “clicked(bool)”;
从对话框右侧选中 “setChecked(bool)”;
点击对话框下⽅的按钮 “OK”,完成该信号/槽连接的配置。