python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例

在下面这3篇文章中我们给出了手工输入代码的信号与槽的使用方法,因为采用这种方法介绍时,会简单一些,如果使用Qt Designer来介绍这些功能,那么任何一个简单的功能都会使用xxxx.ui xxxx.py call_xxxx.py三个文件 来实现,这样内容会显得很乱

python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

在实战应用中,由于Qt Designer可以很好的实现界面显示与业务逻辑分离,所有能保住我们解决大量的代码,如果能够使用Qt Designer自动创建一些信号与槽机制,那就更好了。

本例要实现的功能是:通过一个模拟打印的界面来详细说明信号的使用,在打印时,可以设置打印的份数,纸张类型,触发打印按钮后,将执行结果显示在右侧,通过QCheckBox(全屏预览 复选框)来选择是否通过全屏模式进行预览,将执行结果显示在右侧

按F1键可以显示helpmessage帮助信息

第一步:Qt Designer

首先,使用Qt Designer新建一个模板名为widget的简单窗口,通过将widget box区域的控件拖曳到窗口中,实现如图的界面效果

这里对窗口控件进行简要说明

控件类型 控件名称 作用
QSpinBox numberSpinBox 显示打印的分数
QComboBox styleCombo 显示打印的纸张类型,纸张类型包括A3,A4等
QPushButton printButton 连接emitPrintSiagnal函数的绑定,触发自定义信号printSignal的发射
QCheckBox prievewState 是否全屏预览
QPushButton priviewButton 连接emitPreviewSignal函数的绑定,触发自定义信号previewSignal的发射
QLabel resultLabel 显示执行结果

第二步:将界面文件ui转换为py文件

pyuic5 -o xxxxx.py xxxxx.ui

会在界面文件同级目录下生成一个py文件

查看所生成的.py文件,完整代码如下

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainWinSignalSlog02.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(715, 225)
    self.controlsGroup = QtWidgets.QGroupBox(Form)
    self.controlsGroup.setGeometry(QtCore.QRect(10, 20, 451, 151))
    self.controlsGroup.setObjectName("controlsGroup")
    self.widget = QtWidgets.QWidget(self.controlsGroup)
    self.widget.setGeometry(QtCore.QRect(10, 40, 411, 30))
    self.widget.setObjectName("widget")
    self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
    self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
    self.horizontalLayout.setObjectName("horizontalLayout")
    self.label = QtWidgets.QLabel(self.widget)
    self.label.setObjectName("label")
    self.horizontalLayout.addWidget(self.label)
    self.numberSpinBox = QtWidgets.QSpinBox(self.widget)
    self.numberSpinBox.setObjectName("numberSpinBox")
    self.horizontalLayout.addWidget(self.numberSpinBox)
    self.styleCombo = QtWidgets.QComboBox(self.widget)
    self.styleCombo.setObjectName("styleCombo")
    self.styleCombo.addItem("")
    self.styleCombo.addItem("")
    self.styleCombo.addItem("")
    self.horizontalLayout.addWidget(self.styleCombo)
    self.label_2 = QtWidgets.QLabel(self.widget)
    self.label_2.setObjectName("label_2")
    self.horizontalLayout.addWidget(self.label_2)
    self.printButton = QtWidgets.QPushButton(self.widget)
    self.printButton.setObjectName("printButton")
    self.horizontalLayout.addWidget(self.printButton)
    self.widget1 = QtWidgets.QWidget(self.controlsGroup)
    self.widget1.setGeometry(QtCore.QRect(10, 100, 201, 30))
    self.widget1.setObjectName("widget1")
    self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)
    self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
    self.horizontalLayout_2.setObjectName("horizontalLayout_2")
    self.previewStatus = QtWidgets.QCheckBox(self.widget1)
    self.previewStatus.setObjectName("previewStatus")
    self.horizontalLayout_2.addWidget(self.previewStatus)
    self.previewButton = QtWidgets.QPushButton(self.widget1)
    self.previewButton.setObjectName("previewButton")
    self.horizontalLayout_2.addWidget(self.previewButton)
    self.resultGroup = QtWidgets.QGroupBox(Form)
    self.resultGroup.setGeometry(QtCore.QRect(470, 20, 231, 151))
    self.resultGroup.setObjectName("resultGroup")
    self.resultLabel = QtWidgets.QLabel(self.resultGroup)
    self.resultLabel.setGeometry(QtCore.QRect(20, 30, 191, 101))
    self.resultLabel.setObjectName("resultLabel")
    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)
  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "打印控件"))
    self.controlsGroup.setTitle(_translate("Form", "打印控制"))
    self.label.setText(_translate("Form", "打印份数:"))
    self.styleCombo.setItemText(0, _translate("Form", "A3"))
    self.styleCombo.setItemText(1, _translate("Form", "A4"))
    self.styleCombo.setItemText(2, _translate("Form", "A5"))
    self.label_2.setText(_translate("Form", "纸张类型:"))
    self.printButton.setText(_translate("Form", "打印"))
    self.previewStatus.setText(_translate("Form", "全屏预览"))
    self.previewButton.setText(_translate("Form", "预览"))
    self.resultGroup.setTitle(_translate("Form", "操作结果"))
    self.resultLabel.setText(_translate("Form", "<html><head/><body><p><br/></p></body></html>"))

第三步:新建调用窗口

为了使窗口的显示与业务逻辑分离,在建一个调用窗口显示的文件,在调用类中添加多个自定义信号,并与槽函数进行绑定,其完整代码如下

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from jia_07 import Ui_Form
from PyQt5.QtCore import pyqtSignal, Qt
class MyMainWindow(QMainWindow, Ui_Form):
  helpSignal = pyqtSignal(str)
  printSignal = pyqtSignal(list)
  # 声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号
  previewSignal = pyqtSignal([ int, str ], [ str ])
  def __init__( self, parent=None ):
    super(MyMainWindow, self).__init__(parent)
    self.setupUi(self)
    self.initUI()
  def initUI( self ):
    self.helpSignal.connect(self.showHelpMessage)
    self.printSignal.connect(self.printPaper)
    self.previewSignal[ str ].connect(self.previewPaper)
    self.previewSignal[ int, str ].connect(self.previewPaperWithArgs)
    self.printButton.clicked.connect(self.emitPrintSignal)
    self.previewButton.clicked.connect(self.emitPreviewSignal)
  # 发射预览信号
  def emitPreviewSignal( self ):
    if self.previewStatus.isChecked() == True:
      self.previewSignal[ int, str ].emit(1080, " Full Screen")
    elif self.previewStatus.isChecked() == False:
      self.previewSignal[ str ].emit("Preview")
  # 发射打印信号
  def emitPrintSignal( self ):
    pList = [ ]
    pList.append(self.numberSpinBox.value())
    pList.append(self.styleCombo.currentText())
    self.printSignal.emit(pList)
  def printPaper( self, list ):
    self.resultLabel.setText("打印: " + "份数:" + str(list[ 0 ]) + " 纸张:" + str(list[ 1 ]))
  def previewPaperWithArgs( self, style, text ):
    self.resultLabel.setText(str(style) + text)
  def previewPaper( self, text ):
    self.resultLabel.setText(text)
    # 重载点击键盘事件
  def keyPressEvent( self, event ):
    if event.key() == Qt.Key_F1:
      self.helpSignal.emit("help message")
  # 显示帮助消息
  def showHelpMessage( self, message ):
    self.resultLabel.setText(message)
    self.statusBar().showMessage(message)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  win = MyMainWindow()
  win.show()
  sys.exit(app.exec_())

运行程序,显示效果如图

代码分析

在上面的例子中,通过PyQtSignal()定义了三个信号,一个str参数类型的信号,一个list类型参数类型的信号,一个多重载版本的信号,包括一个int和str类型参数的信号,以及带str类型参数的信号

    helpSignal = pyqtSignal(str)

    printSignal = pyqtSignal(list)

    # 声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数的信号

    previewSignal = pyqtSignal([ int, str ], [ str ])

对于绑定信号与槽,这里着重说明多重版本的信号绑定,prieviewSignal有两个版本,即previewSignal(str)和prievewSignal(int ,str),由于两个版本,因此在绑定的时候,需要显示指定信号与槽的绑定

        self.helpSignal.connect(self.showHelpMessage)

        self.printSignal.connect(self.printPaper)

        self.previewSignal[ str ].connect(self.previewPaper)

        self.previewSignal[ int, str ].connect(self.previewPaperWithArgs)

在Qt的机制中,根据所传递信号的参数类型和个数,连接到不同的槽函数

    def emitPreviewSignal( self ):

        if self.previewStatus.isChecked() == True:

            self.previewSignal[ int, str ].emit(1080, " Full Screen")

        elif self.previewStatus.isChecked() == False:

            self.previewSignal[ str ].emit("Preview")

信号发射可以传递python数据类型的参数,本例中的printSignal信号可以传递list类型的参数plist

 def emitPrintSignal( self ):

        pList = [ ]

        pList.append(self.numberSpinBox.value())

        pList.append(self.styleCombo.currentText())

        self.printSignal.emit(pList)

通过复写KeyPressEvent()方法,对F1键进行功能扩展,这里通过复写keyPressEvent()方法模拟发射所需的信号,来完成对应的任务

  def keyPressEvent( self, event ):

        if event.key() == Qt.Key_F1:

          self.helpSignal.emit("help message")

本文主要讲解了PyQt5结合Qt Designer创建信号与槽的详细方法与实例,另外一篇关于PyQt5结合Qt Designer创建信号与槽的文章 python GUI库图形界面开发之PyQt5信号与槽基本操作 大家也可以结合阅读下,更多关于 PyQt5信号与槽的知识请查看下面的相关链接

(0)

相关推荐

  • PyQt5 在label显示的图片中绘制矩形的方法

    在利用QT编写GUI程序时经常需要一些交互操作,常见的有鼠标事件.键盘事件等.今天我们要实现的是在label中已经显示的图像中绘制矩形框,以便进行下一步操作(如放大细节,选中感兴趣区域等)程序主要参考了知乎的小杨老师的专栏. 核心点是重写Label,使其实现相应的功能,看下面的一个小例子 from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt from PyQt5.Q

  • python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例

    PyQt5表格控件QTableView简介 在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到QTableView类了,在QTableView中可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源 QTableWidget继承自QTableView,主要区别是QTableView可以使用自定义的数据模型来显示内容(先通setModel来绑定数据源),而QTableWidget自能使用标准的数据模型,并且其单元格数据是通过QTableWidg

  • python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

    装饰器信号与槽 所谓装饰器信号与槽,就是通过装饰器的方法来定义信号与槽函数,具体的使用方法如下 @PyQt5.QtCore.pyqtSlot(参数) def on_发送者对象名称_发射信号名称(self,参数): pass 这种方法有效的前提是下面的函数已经执行: QMetaObject.connectSlotsByName(QObject) 在上面的代码中,'发送者对象名称'就是使用setObjectName函数设置的名称,因此自定义槽函数的命名规则也可以看做:on+使用setObjectNa

  • python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例

    PyQt5选项卡控件QTabWidget简介 QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多,则可以对这些字段进行拆分,分别放置在不同界面的选项卡中 QTabWidget类中常用的方法 方法 描述 addTab() 将一个控件添加到Tab控件的选项卡中 insertTab() 将一个Tab控件的选项卡插入到指定的位置 removeTab() 根据指定的索引删除Tab控件 setCurren

  • python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例

    信号与槽有三种使用方法 第一种:内置信号与槽的使用 第二种:自定义信号与槽的使用 第三种:装饰器的信号与槽的使用 一: 内置信号与槽的使用 内置信号与槽的使用,是指在发射信号时,使用窗口控件的函数,而不是自定义的函数,这种也是我们前面用的最多的,下面简单的一个实例,大家就会明白 import sys from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget app=QApplication(sys.argv)

  • python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例

    PyQt5打印控件QPrinter简介 打印图像是图像处理软件中的一个常用功能,打印图像实际上是在QPaintDevice中画图,与平时在QWidget.QPixmap和QImage中画图是一样的,都是创建一个QPainter对象进行画图的,只是打印使用的是QPrinter,它的本质上也是一个QPainterDevice(绘图设备) QPrinter的使用实例 import sys from PyQt5.QtWidgets import QApplication,QMainWindow,QLab

  • python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例

    PyQt5布局控件QFormLayout简介 QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表单是提示用户进行交互的一种模式,主要有两列组成,第一列用于显示信息,给用户提示,一般叫做label域,第二列需要用户进行选择或输入,一般叫做field域,label与field的关系就是label关联field QFormLayout表单布局的使用实例 import sys from PyQt5.QtWidgets import QApplication

  • python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例

    PyQt5 MDI(多文档窗口)QMidArea简介 一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Single Document Interface 单文档界面),每个窗口都有自己的菜单系统,工具栏等,这需要占用很多资源 MDI(Multiple Document Interface 多文档界面)应用程序占用较少的内存资源,子窗口可以放在主窗口的容器中,这个容器控件被称为QMidArea QMidArea控件通常占据在QMainWindow对象的中央位置,子窗口

  • Python3使用PyQt5制作简单的画板/手写板实例

    1.前言 版本:Python3.6.1 + PyQt5 写一个程序的时候需要用到画板/手写板,只需要最简单的那种.原以为网上到处都是,结果找了好几天,都没有找到想要的结果. 网上的要么是非python版的qt程序(要知道qt版本之间差异巨大,还是非同一语言的),改写难度太大.要么是PyQt4的老程序,很多都已经不能在PyQt5上运行了.要么是大神写的特别复杂的程序,简直是直接做出了一个Windows自带的画图版,只能膜拜~ 于是我只能在众多代码中慢慢寻找自己需要的那一小部分,然后不断地拼凑,不断

  • python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

    在PyQt中常用的图像类有四种,QPixmap,QImage,QPicture,QBitmap 类型 描述 QPixmap 专门为绘图设计的,在绘制图片时需要使用QPixmap QImage 提供了一个与硬件无关的图像表示函数,可以用于图片像素级访问 QPicture 是一个绘图设备类,它继承自QPainter类,可以使用QPainter的begin()函数在QPicture上绘图,使用end()函数结束绘图,使用QPicture的save()函数将QPainter所使用的绘图指令保存在文件中

  • python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例

    PyQt5树形结构控件QTreeWidget简介 QTreeWidget 类根据预设的模型提供树形显示控件. QTreeWidget 使用类似于 QListView 类的方式提供一种典型的基于 item 的树形交互方法类,该类基于QT的"模型/视图"结构,提供了默认的模型来支撑 item 的显示,这些 item 类为 QTreeWidgetItem 类. 如果不需要灵活的"模型/视图"框架,可以使用QTreeWidget 来创建有层级关系的树形结构.当把标准 ite

  • python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析

    PyQt5中信号与槽可以说是对事件处理机制的高级封装,如果说事件是用来创建窗口控件的,那么信号与槽就是用来对这个控件进行使用的,比如一个按钮,当我们使用按钮时,只关心clicked信号,至于这个按钮如何接受并处里鼠标点击事件,然后在发射这个信号,则不关心,但是如果要重载一个按钮,这时候就要关心了,比如可以改变它的行为:在鼠标按下时触发clicked信号,而不是释放时 PyQt5常见事件类型 pyqt是对Qt的封装,qt程序是事件驱动的,它的每个动作都有幕后某个事件所触发,Qt事件类型有很多,常见

  • python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例

    PyQt5布局控件QGridLayout简介 QGridLayout(网格布局)是将窗口分割成行和列的网格来进行排列,通常可以使用函数addWidget()将被管理的控件(Widget)添加到窗口中,或者使用addLayout()函数将布局(layout)添加到窗口中,也可以通过addWIdget()函数对所添加的控件设置行数与列数的跨越,最后实现网格占据多个窗格 QGridLayout类中常用的方法 方法 描述 addWidget(QWidget Widget,int row,int col,

  • python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例

    PyQt5布局控件QHBoxLayout简介 采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLayout类继承自QBoxLayout 采用QHBoxLayout类,按照从左到右的顺序来添加控件 QHBoxLayout类中常用的方法如下 方法 描述 addLayout(self,stretch=0) 在窗口的右边添加布局,使用stretch(伸缩量)进行伸缩,伸缩量默认为0 addWidget(self,QWidget.stretch,Qt.Align

  • python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用户拖动子控件的边界控制子控件的大小,并提供一个处理拖曳子控件的控制器 在QSplitter对象中各子控件默认是横向布局的,可以使用Qt,Vertical进行垂直布局 QSplitter类中常用的方法 方法 描述 addWidget() 将小控件添加到QSplitter管理器的布局中 indexOf(

  • python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例

    PyQt5简单多线程信号与槽的使用 最简单的多线程使用方法是利用QThread函数,展示QThread函数和信号简单结合的方法 import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * class Main(QWidget): def __init__( self, parent=None ): super(Main, self).__init__(parent) #创建一个线程实例并设置名称 变量 信号与槽 self

  • python+pyqt5实现图片批量缩放工具

    批量修改图片大小好像用PS也可以,不过我不会,程序猿就用程序来解决. 这段时间学了下Python,很强大,之前一些不知道怎么处理的东西在Python里面都能找到解决方法. 工具界面如下图 这个工具需要用到第三方库 Pillow 和 Pyqt5,可通过命令行安装. pip install pillow pip install pyqt5 代码: #!-*-coding:utf-8-*- from PIL import Image import hashlib, os, sys from PyQt5

  • python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例

    PyQt5滚动条控件QScrollBar简介 可以看到,前面介绍的几个窗口控件的共同点是新建一些窗口来装载更多的控件,而QScrollBar提供了另一种思路:这个控件提供水平的或垂直的滚动条,这样可以扩大当前窗口的有效装载面积,从而装载更多的控件 QScrollBar类中常用的信号 信号 含义 valueChanged 当滑动条的值改变发射此信号 sliderMoved 当用户拖动滑块时发射此信号 QScrollBar的使用实例 import sys from PyQt5.QtWidgets i

  • python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例

    在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口 pyqt提供了一些标准的对话框类,用于输入数据,修改数据,更改应用的设置等,常见的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之间传参数有两种常用的方式,一种在自定义对话框之间通过属性传参,另一种在窗口之间使用信号与槽机制传参

  • python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例

    PyQt5布局控件QVBoxLayout简介 采用QVBoxLayout类,按照从上到下的顺序添加控件 本节内容较少,演示两个实例,便于明白QVBoxLayout(垂直布局)的使用 QVBoxLayout的正常使用实例 import sys from PyQt5.QtWidgets import QApplication ,QWidget ,QVBoxLayout , QPushButton class Winform(QWidget): def __init__(self,parent=Non

  • python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

    PyQt5信号与槽高级自定义信号与槽 所谓高级自定义信号与槽,指的就是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数,自定义信号的一般流程如下 定义信号 定义槽函数 连接信号与槽函数 发射信号 1.定义信号 通过类成员变量定义信号对象 #无参数的信号 signal1=pyqtSignal() #带一个参数(整数)的信号 signal2=pyqtSignal(int) #带两个参数(整数,字符串)的信号 signal3=pyqtSignal(int,str) #带一个参数(列表)的信号 si

随机推荐