PyQt5通信机制 信号与槽详解


Posted in Python onAugust 07, 2019

 前言

信号和槽是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。界面如下:

PyQt5通信机制 信号与槽详解

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

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

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

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

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'signal.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(431, 166)
    self.pushButton = QtWidgets.QPushButton(Form)
    self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
    font = QtGui.QFont()
    font.setFamily("YaHei Consolas Hybrid")
    font.setPointSize(14)
    self.pushButton.setFont(font)
    self.pushButton.setObjectName("pushButton")
    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)
  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "信号与槽"))
    self.pushButton.setText(_translate("Form", "关闭"))

class MyMainForm(QMainWindow, Ui_Form):
  def __init__(self, parent=None):
    super(MyMainForm, self).__init__(parent)
    self.setupUi(self)
    self.pushButton.clicked.connect(self.close)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  myWin = MyMainForm()
  myWin.show()
  sys.exit(app.exec_())

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

PyQt5通信机制 信号与槽详解

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

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

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

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

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'signal.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(431, 166)
    self.pushButton = QtWidgets.QPushButton(Form)
    self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
    font = QtGui.QFont()
    font.setFamily("YaHei Consolas Hybrid")
    font.setPointSize(14)
    self.pushButton.setFont(font)
    self.pushButton.setObjectName("pushButton")
    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)
  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "信号与槽"))
    self.pushButton.setText(_translate("Form", "运行"))
class MyMainForm(QMainWindow, Ui_Form):
  def __init__(self, parent=None):
    super(MyMainForm, self).__init__(parent)
    self.setupUi(self)
    self.pushButton.clicked.connect(self.showMsg)
  def showMsg(self):
    QMessageBox.information(self, "信息提示框", "OK,内置信号与自定义槽函数!")

if __name__ == "__main__":
  app = QApplication(sys.argv)
  myWin = MyMainForm()
  myWin.show()
  sys.exit(app.exec_())

运行结果如下:

PyQt5通信机制 信号与槽详解

Qt Designer添加控件信号与槽

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

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

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

PyQt5通信机制 信号与槽详解

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

PyQt5通信机制 信号与槽详解

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

PyQt5通信机制 信号与槽详解

小结

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分享一个简单的python读写文件脚本
Nov 25 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
Python递归函数特点及原理解析
Mar 04 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
Python echarts实现数据可视化实例详解
Mar 03 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 #Python
python获取Pandas列名的几种方法
Aug 07 #Python
python 提取文件指定列的方法示例
Aug 07 #Python
PyQt Qt Designer工具的布局管理详解
Aug 07 #Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 #Python
python利用7z批量解压rar的实现
Aug 07 #Python
django基础学习之send_mail功能
Aug 07 #Python
You might like
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
python实现批量图片格式转换
2020/06/16 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
详解python变量与数据类型
2020/08/25 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
什么是组件架构
2016/05/15 面试题
医院实习介绍信
2014/01/12 职场文书
2014年党课学习材料
2014/05/11 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
初中地理教学反思
2016/02/19 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Redis集群的关闭与重启操作
2021/07/07 Redis
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python