信号和槽是PyQt编程对象之间进行通信的机制。每个继承自QWideget的控件都支持信号与槽机制。信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理)。本文主要讲述信号和槽最基本、最经常使用方法。就是内置信号和槽的使用的使用方法。

内置信号和槽

所谓内置信号与槽的使用。是指在发射信号时,使用窗口控件的函数,而不是自定义的函数。信号与槽的连接方法是通过QObject.signal.connect将一个QObject的信号连接到另一个QObject的槽函数。

在任何GUI设计中,按钮都是最重要的和常用的触发动作请求的方式,用来与用户进行交互操作。常见的按钮包括QPushButton、QRadioButton和QCheckBox。这些按钮都继承自QAbstractButton类,QAbstractButton提供的信号包括:

Clicked:鼠标左键点击按钮并释放触发该信号。最常用。记住这个就差不多够了。

Pressed:鼠标左键按下时触发该信号

Released:鼠标左键释放时触发该信号

Toggled:控件标记状态发生改变时触发该信号。

内置信号和槽使用实例

这里实现一个点击按钮退出界面需求实现过程来介绍内置信号和槽。开始动手。。。

Step1:打开Qt Designer,选择Widget模板。在工具箱中拖动Push Button控件按钮到主界面。并修改控件显示名称。保存为singal.ui。界面如下:

Step2:使用pyuic5 -o singal.py singal.ui转换成.py格式。

Step3:为考虑介绍方便,将调用程序在singal.py中主程序。其中MyMainForm类中的命令行为Push Button按钮点击信号添加槽函数。如下

self.pushButton.clicked.connect(self.close)

完整代码如下(可直接拷贝运行,字体加粗部分为添加部分):

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Form implementation generated from reading ui file 'signal.ui'
  4. #
  5. # Created by: PyQt5 UI code generator 5.11.3
  6. #
  7. # WARNING! All changes made in this file will be lost!
  8.  
  9. import sys
  10. from PyQt5 import QtCore, QtGui, QtWidgets
  11. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
  12. class Ui_Form(object):
  13. def setupUi(self, Form):
  14. Form.setObjectName("Form")
  15. Form.resize(431, 166)
  16. self.pushButton = QtWidgets.QPushButton(Form)
  17. self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
  18. font = QtGui.QFont()
  19. font.setFamily("YaHei Consolas Hybrid")
  20. font.setPointSize(14)
  21. self.pushButton.setFont(font)
  22. self.pushButton.setObjectName("pushButton")
  23.  
  24. self.retranslateUi(Form)
  25. QtCore.QMetaObject.connectSlotsByName(Form)
  26.  
  27. def retranslateUi(self, Form):
  28. _translate = QtCore.QCoreApplication.translate
  29. Form.setWindowTitle(_translate("Form", "信号与槽"))
  30. self.pushButton.setText(_translate("Form", "关闭"))
  31.  
  32. class MyMainForm(QMainWindow, Ui_Form):
  33. def __init__(self, parent=None):
  34. super(MyMainForm, self).__init__(parent)
  35. self.setupUi(self)
  36. self.pushButton.clicked.connect(self.close)
  37. if __name__ == "__main__":
  38. app = QApplication(sys.argv)
  39. myWin = MyMainForm()
  40. myWin.show()
  41. sys.exit(app.exec_())

运行并点击如下按钮就可以关闭窗口

内置信号和自定义槽使用实例

实现过程同上述步骤一样。槽函数showMsg为自定义函数。

信号与槽:self.pushButton.clicked.connect(self.showMsg)

完整代码如下(可直接拷贝运行,字体加粗部分为添加部分):

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Form implementation generated from reading ui file 'signal.ui'
  4. #
  5. # Created by: PyQt5 UI code generator 5.11.3
  6. #
  7. # WARNING! All changes made in this file will be lost!
  8. import sys
  9. from PyQt5 import QtCore, QtGui, QtWidgets
  10. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
  11. class Ui_Form(object):
  12. def setupUi(self, Form):
  13. Form.setObjectName("Form")
  14. Form.resize(431, 166)
  15. self.pushButton = QtWidgets.QPushButton(Form)
  16. self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
  17. font = QtGui.QFont()
  18. font.setFamily("YaHei Consolas Hybrid")
  19. font.setPointSize(14)
  20. self.pushButton.setFont(font)
  21. self.pushButton.setObjectName("pushButton")
  22.  
  23. self.retranslateUi(Form)
  24. QtCore.QMetaObject.connectSlotsByName(Form)
  25.  
  26. def retranslateUi(self, Form):
  27. _translate = QtCore.QCoreApplication.translate
  28. Form.setWindowTitle(_translate("Form", "信号与槽"))
  29. self.pushButton.setText(_translate("Form", "运行"))
  30.  
  31. class MyMainForm(QMainWindow, Ui_Form):
  32. def __init__(self, parent=None):
  33. super(MyMainForm, self).__init__(parent)
  34. self.setupUi(self)
  35. self.pushButton.clicked.connect(self.showMsg)
  36. def showMsg(self):
  37. QMessageBox.information(self, "信息提示框", "OK,内置信号与自定义槽函数!")
  38. if __name__ == "__main__":
  39. app = QApplication(sys.argv)
  40. myWin = MyMainForm()
  41. myWin.show()
  42. sys.exit(app.exec_())

运行结果如下:

Qt Designer添加控件信号与槽

上述介绍的内容是通过代码方式实现内置信号与槽的连接。那Qt Designer工具可以实现信号与槽的连接?之前在第二节课Qt Designer主界面介绍时提过信号槽区域。一直没有讲如何使用。通过这个区域功能是可以实现信号与槽的连接的。

还是以添加内置信号与槽来介绍。

Step1:打开Qt Designer界面,找到信号槽编辑区。如下

Step2:点击+号 Sender控件选择"PushButton"、Signal信号选择"clicked",Receiver选择"Form",内置槽函数选择"close()"

Step3:保存.ui格式,并使用pyuic转换成.py格式,添加调用程序,运行。效果一样。这些步骤都介绍过,不再重复介绍,关键代码如下:

小结

本文介绍了PyQt5信号与槽最基本的使用方法。知道如何在Qt Designer生成的.py文件中添加控件信号与槽的关系并且知道如何调用自定义槽函数。掌握了这些,应该就可以动手实现一些基本的需求了。

到这里,按照这几个章节的介绍应该可以动手完成简单需求的实现。至于更进一步的学习,可以通过实践过程中遇到的问题以及小工具开发需求去驱动加深理解可能效果会好一点。

[ PyQt入门教程 ] PyQt5信号与槽的更多相关文章

  1. [ PyQt入门教程 ] PyQt5环境搭建和配置

    PyQt入门系列教程主要目的是希望通过该系列课程学习,可以使用PyQt5工具快速实现简单的界面开发,包括界面设计.布局管理以及业务逻辑实现(信号与槽).简单说就是可以使用PyQt5工具快速画一个控件摆 ...

  2. [ PyQt入门教程 ] PyQt5中多线程模块QThread使用方法

    本文主要讲解使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题.用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭.这样 ...

  3. [ PyQt入门教程 ] PyQt5基本控件使用:消息弹出、用户输入、文件对话框

    本文主要介绍PyQt界面实现中常用的消息弹出对话框.提供用户输入的输入框.打开文件获取文件/目录路径的文件对话框.学习这三种控件前,先想一下它们使用的主要场景: 1.消息弹出对话框.程序遇到问题需要退 ...

  4. [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框

    本文主要介绍PyQt5界面最基本使用的单选按钮.复选框.下拉框三种控件的使用方法进行介绍. 1.RadioButton单选按钮/CheckBox复选框.需要知道如何判断单选按钮是否被选中. 2.Com ...

  5. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  6. [ PyQt入门教程 ] Qt Designer工具的使用

    Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用.本文 ...

  7. pyqt5信号与槽2

    信号和槽与类的属性和方法在层次上是相同的,同属与一个类的特征. 信号的定义由工厂函数生成: signal=PyQt5.QtCore.pyqtSignal(types[, name[, result[, ...

  8. PyQt5信号与槽详解

    1.信号与槽函数基础'''信号与槽函数基础,信号是一个事件,发射信号之后槽函数就会执行'''from PyQt5.QtWidgets import *import sys class signal(Q ...

  9. PyQt5信号与槽关联的两种方式

    目录 通过QtDesigner 手动关联的方式 通过QtDesigner 单击菜单栏切换到信号槽编辑模式 单击控件并拖动鼠标到信号的接收对象上,一般为对话框自己,松开鼠标弹出信号和槽选择框 选中cli ...

随机推荐

  1. JIRA的安装部署问题

    JIRA的安装部署问题: 因电脑上装了两人系统,导致我的JIRA服务不能和tomcat同时启动,让我弄了好久都不知道是啥原因,经过请教,总算得出原来是JIRA的Port和Tomcat的Port冲突.在 ...

  2. springboot 2.X 在访问静态资源的的时候出现404的问题

    通过idea快速搭建一个springboot项目: springboot版本2.1.6 在网上看的资料,springboot静态资源访问如下: "classpath:/META‐INF/re ...

  3. 阿里云ECS发送企业邮件

    <?phpuse PHPMailer\PHPMailer\PHPMailer;require '../vendor/autoload.php'; $mail = new PHPMailer(tr ...

  4. isinstance()函数判断数据类型

    判断是否是字符串 a = b = " print(isinstance(a,str)) print(isinstance(b,str)) False True 判断是否是列表 a = [,, ...

  5. 学习kafka自己发生的几个小错误记录

    一.  The method iterator() is ambiguous ConsumerIterator<byte[],byte[]> it =stream.iterator(); ...

  6. PHP 碎碎念

    class Object { public static function get_self() { return new self(); } public static function get_s ...

  7. spring boot使用log4j2将日志写入mysql数据库

    log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...

  8. Python题整理

    1.Python的多态.鸭子类型? 2.Python的序列化工具有哪些? 3.Python处理Excel的工具有哪些? 4.Python处理Graph的算法库有哪些? 5.Python的dict是基于 ...

  9. Requests方法 -- 项目实现自动发送邮件

    """1.discover方法里面有三个参数:-case_dir:这个是待执行用例的目录.-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开 ...

  10. springcloud高可用方案

    1. 场景描述 公司在规划后续可能会做中台服务,考虑用微服务的方案,让用springcloud部署个简单的高可用Demo. 2. 解决方案 2.1 方案说明 demo用了5台虚拟机: (1)1台gat ...