Python 小白从零开始 PyQt5 项目实战(3)信号与槽的连接_pyqt5 信号与槽的连接

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

+ 注意在 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”,完成该信号/槽连接的配置。

在这里插入图片描述

2.4 信号与槽的连接:发送者是动作对象

常见的信号发送者是图形窗口中的各种控件对象,但也可以是动作对象。本例介绍对菜单栏和工具栏中控件对象建立信号与槽的连接。

信号的发送者是动作对象时,信号的接收者通常是顶层对象 “MainWindow”,而槽函数可以是对象 “MainWindow” 的内置函数,也可以是自定义函数。

在上一篇文章中我们曾为菜单栏和工具栏中的动作 “actionQuit” 建立信号/槽连接,就是发送者是动作对象、连接到对象 “MainWindow” 的内置函数的案例。其操作过程如下:

  • 从在 QtDesigner 右侧下方窗口 “信号/槽编辑器”,点击绿色的 “+” 新建一个信号/槽连接;
  • 点击 “<发送者>”,从菜单中选择对象 “actionQuit”;
  • 点击 “<信号>”,从菜单中选择 “triggered()”;
  • 点击 “<接收者>”,从菜单中选择 “MainWindow”;
  • 点击 “<槽>”,从菜单中选择 “closed()”。

以上操作的作用是:发送者 对象 “actionQuit” 触发 “triggered()” 时,接收者 对象"MainWindow" 执行槽函数 “closed()”。

下面我们再为另一个动作 “actionHelp” 建立信号/槽连接,连接的槽函数为自定义函数 trigger_actHelp()。其操作过程如下:

  • 在 QtDesigner 将自定义函数 trigger_actHelp() 添加到槽函数配置连接表中;
  • 从在 QtDesigner 右侧下方窗口 “信号/槽编辑器”,点击绿色的 “+” 新建一个信号/槽连接;
  • 点击 “<发送者>”,从菜单中选择对象 “actionHelp”;
  • 点击 “<信号>”,从菜单中选择 “triggered()”;
  • 点击 “<接收者>”,从菜单中选择 “MainWindow”;
  • 点击 “<槽>”,从菜单中选择 “trigger_actHelp()”。

至此,本章介绍了用 QtDesigner 进行几种常见的信号/槽连接的编辑和设置方法。如下图所示,在 QtDesigner 中所添加的信号/槽连接都会在信号/槽编辑器窗口内显示。

在这里插入图片描述


3. 图形界面的主程序

上节在 QtDesigner 中完成了图形界面的设计,将该文件另存为 uiDemo4.ui。打开 PyCharm,选中文件 uiDemo4.ui,使用 PyUIC 可以将其转换为 uiDemo4.py。

接下来我们要编写图形界面的主程序,调用图形界面设计文件 uiDemo4.py。

3.1 从面向过程到面向对象

面向过程的程序设计

在上一篇文章中,我们在主程序中创建主窗口后,直接调用 UI 中的 Ui_MainWindow()。这是面向过程的程序设计方法。

# GUIdemo3.py
import uiDemo3  # 导入图像界面设计文件

if __name__ == '\_\_main\_\_':
    app = QApplication(sys.argv)  # 创建应用程序对象
    MainWindow = QMainWindow()  # 创建主窗口
    ui = uiDemo3.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()  # 显示主窗口
    sys.exit(app.exec_())  # 在主线程中退出

面向对象的程序设计

随着项目的不断深入,需要处理更加丰富的图形界面和实现更加复杂的软件功能,程序的规模越来越大,程序的结构越来越复杂。
面向对象的程序设计使程序的结构更加清晰,从而易于阅读、理解、开发和维护,非常适合开发大规模、多任务的图形界面应用软件。PyQt5 中的类、对象、控件和方法,都是面向对象的程序设计的概念。因此,从本文开始我们采用面向对象的程序设计方法,来编写图形界面的主程序。

例程 GUIdemo4.py 如下:

from uiDemo4 import Ui_MainWindow  # 导入 uiDemo4.py 中的 Ui\_MainWindow 界面类

class MyMainWindow(QMainWindow, Ui_MainWindow):  # 继承 QMainWindow类和 Ui\_MainWindow界面类
    def \_\_init\_\_(self, parent=None):
        super(MyMainWindow, self).__init__(parent)  # 初始化父类
        self.setupUi(self)  # 继承 Ui\_MainWindow 界面类
        
if __name__ == '\_\_main\_\_':
    app = QApplication(sys.argv)  # 在 QApplication 方法中使用,创建应用程序对象
    myWin = MyMainWindow()  # 实例化 MyMainWindow 类,创建主窗口
    myWin.show()  # 在桌面显示控件 myWin
    sys.exit(app.exec_())  # 结束进程,退出程序

在上面这个例程中,我们创建了一个类 MyMainWindow(),它继承了 QtWidgets.QMainWindow 类方法和导入的 uiDemo4.py 中的 Ui_MainWindow 界面类。

“super(MyMainWindow, self).init()”:初始化父类,把 MyMainWindow 的对象 self 转成父类 QMainWindow 对象,并调用 init 函数。

“self.setupUi(self)”:继承 uiDemo4.py 中的 Ui_MainWindow 界面类,调用 Ui_MainWindow 类的setupUi() 方法。

不熟悉面向对象程序设计的小白,如果看不懂这段程序也没有关系,保存下来照猫画虎就可以了。

3.2 自定义槽函数

运行例程 GUIdemo4.py。咦,报错了:

AttributeError: ‘MyMainWindow’ object has no attribute ‘click_pushButton_2’

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt是一个用于创建图形用户界面(GUI)的Python库。它是基于Qt框架的Python绑定,可以让开发者使用Python语言来创建功能强大的跨平台应用程序。 PyQt提供了一个名为Qt Designer的可视化工具,可以帮助开发者快速设计和布局GUI界面。在Qt Designer中,你可以通过拖拽和放置控件来创建界面,并设置它们的属性和信号关联。 一旦你设计好了界面,Qt Designer可以将它保存为.ui文件。然后,你可以使用PyQt提供的工具将.ui文件转换为Python代码。这样,你就可以在Python中使用这些自动生成的代码来创建和操作界面。 下面是一个简单的示例,展示了如何使用PyQt自动生成代码: 1. 首先,你需要安装PyQt库。可以使用pip命令进行安装: ``` pip install PyQt5 ``` 2. 打开Qt Designer,并设计你的界面。将控件拖拽到窗口中,并设置它们的属性和信号关联。 3. 保存你的界面为.ui文件,比如"mainwindow.ui"。 4. 使用pyuic工具将.ui文件转换为Python代码。在命令行中执行以下命令: ``` pyuic5 -x mainwindow.ui -o mainwindow.py ``` 这将生成一个名为"mainwindow.py"的Python文件,其中包含自动生成的代码。 5. 在你的Python脚本中导入生成的代码,并使用它来创建和操作界面。例如: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow from mainwindow import Ui_MainWindow class MyMainWindow(QMainWindow): def __init__(self): super().__init__() # 创建界面对象 self.ui = Ui_MainWindow() self.ui.setupUi(self) # 在这里可以添加自定义的代码来操作界面 if __name__ == "__main__": app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的示例中,我们导入了自动生成的代码"mainwindow.py",并使用它来创建一个自定义的主窗口类MyMainWindow。在MyMainWindow的构造函数中,我们创建了界面对象并将其与主窗口关联起来。然后,你可以在这个类中添加自定义的代码来操作界面。 这就是使用PyQt自动生成代码的基本过程。通过Qt Designer和pyuic工具,你可以快速创建和修改GUI界面,并使用生成的代码来实现功能。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值