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


Posted in Python onMarch 08, 2020

在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口

pyqt提供了一些标准的对话框类,用于输入数据,修改数据,更改应用的设置等,常见的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之间传参数有两种常用的方式,一种在自定义对话框之间通过属性传参,另一种在窗口之间使用信号与槽机制传参,这里主要介绍第一种

单一窗口的数据传递实例

对于具有单一窗口的程序来说,一个控件的变化会影响另一个控件的变化,这中变化利用信号与槽的关系非常容易解决

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class WinForm(QWidget):
  def __init__(self):
    super(WinForm, self).__init__()
    self.initUI()
  def initUI( self ):
    #先创建水平滑块和Lcd控件
    lcd=QLCDNumber(self)
    slider=QSlider(Qt.Horizontal,self)
    #垂直布局,添加控件
    vbox=QVBoxLayout()
    vbox.addWidget(lcd)
    vbox.addWidget(slider)
    #设置窗口布局
    self.setLayout(vbox)
    #设置滑块数值信号改变连接Lcd的更新
    slider.valueChanged.connect(lcd.display)
    #设置初始位置以及初始大小,设置标题
    self.setGeometry(300,300,350,150)
    self.setWindowTitle('信号与槽:连接滑块LCd')
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

运行效果如图

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

多窗口数据传递:调用属性

新建对话框子窗口属性,我这里的名字为: jia_13多窗口数据传递之调用属性

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
  def __init__(self,parent=None):
    super(DateDialog, self).__init__(parent)
    self.setWindowTitle('DateDialog')
    #在布局中添加控件
    layout=QVBoxLayout(self)
    self.datetime=QDateTimeEdit(self)
    self.datetime.setCalendarPopup(True)
    self.datetime.setDateTime(QDateTime.currentDateTime())
    layout.addWidget(self.datetime)
    buttons=QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel,Qt.Horizontal,self)
    buttons.accepted.connect(self.accept)
    buttons.rejected.connect(self.reject)
    layout.addWidget(buttons)
  def dateTime( self ):
    return self.datetime.dateTime()
  @staticmethod
  def getDateTime(parent=None):
    dialog=DateDialog(parent)
    result=dialog.exec_()
    date=dialog.dateTime()
    return (date.date(),date.time(),result==QDialog.Accepted)

再新建一个主窗口文件,用来调用上一个子窗口

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from jia_13多窗口数据传递之调用属性 import DateDialog
class WinForm(QWidget):
  def __init__(self,parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400,90)
    self.setWindowTitle('对话框关闭时返回值给主窗口的例子')
    self.lineEdit=QLineEdit(self)
    self.button1=QPushButton('弹出对话框1')
    self.button1.clicked.connect(self.onButton1Clicked)
    self.button2=QPushButton('弹出对话框2')
    self.button2.clicked.connect(self.onButton2Clicked)
    gridLayout=QGridLayout(self)
    gridLayout.addWidget(self.lineEdit)
    gridLayout.addWidget(self.button1)
    gridLayout.addWidget(self.button2)
  def onButton1Clicked( self ):
    dialog=DateDialog(self)
    result=dialog.exec_()
    date=dialog.dateTime()
    self.lineEdit.setText(date.date().toString())
    print('\n日期对话框的返回值')
    print('date=%s'%str(date.date))
    print('time=%s'%str(date.time()))
    print('result=%s'%result)
  def onButton2Clicked( self ):
    date,time,result=DateDialog.getDateTime()
    self.lineEdit.setText(date.toString())
    print('\n 日期对话框的返回值')
    print('date=%s' %str(date))
    print('time=%s' %str(time))
    print('result=%s' %result)
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=WinForm()
  form.show()
  sys.exit(app.exec_())

运行程序,显示如图

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

代码分析

在主窗口调用对话框有两种方法,本例中,这两种方法操作效果是一样的,都需要点击弹出对话框按钮,在对话框的时间日期控件中选择日期,则会把选中的日期返回到主窗口的lineTeXt文本控件中

第一中方法:直接在主窗口程序中实例化该对话框,然后调用该对话框的函数,来获取返回值,根据对话框的返回值单击确认按钮还是取消按钮来进行下一步的操作,同理,对于上面的DateDialog,主窗口程序代码如下

 def onButton1Clicked( self ):

        dialog=DateDialog(self)

        result=dialog.exec_()

        date=dialog.dateTime()

        self.lineEdit.setText(date.date().toString())

第二种方法:在主窗口程序中调用子窗口的静态函数,实际上这种方法与第一种方法是一样的,只不过他利用静态函数的特点,在子窗口的静态函数中的创建实例化对象

 def onButton2Clicked( self ):

        date,time,result=DateDialog.getDateTime()

        self.lineEdit.setText(date.toString())

多窗口数据传递信号与槽实例

对于多窗口的数据传递,一般是通过子窗口发射信号的,主窗口通过槽函数捕获这个信号,然后获取信号里面的数据,子窗口发射的信号有两种:一种是发射内置pyqt信号,一种是发射自定义的信号

发射自定义的信号,好处是它的参数可以自定义,可以为int list dict等各种类型与多个参数

新建一个子对话框文件,这里的名称为:jia_14多窗口信号传递之信号与槽

# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
  Signal_OneParameter = pyqtSignal(str)
  def __init__(self, parent=None):
    super(DateDialog, self).__init__(parent)
    self.setWindowTitle('子窗口:用来发射信号')
    # 在布局中添加部件
    layout = QVBoxLayout(self)
    self.label = QLabel(self)
    self.label.setText('前者发射内置信号\n后者发射自定义信号')
    self.datetime_inner = QDateTimeEdit(self)
    self.datetime_inner.setCalendarPopup(True)
    self.datetime_inner.setDateTime(QDateTime.currentDateTime())
    self.datetime_emit = QDateTimeEdit(self)
    self.datetime_emit.setCalendarPopup(True)
    self.datetime_emit.setDateTime(QDateTime.currentDateTime())
    layout.addWidget(self.label)
    layout.addWidget(self.datetime_inner)
    layout.addWidget(self.datetime_emit)
    # 使用两个button(ok和cancel)分别连接accept()和reject()槽函数
    buttons = QDialogButtonBox(
      QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
      Qt.Horizontal, self)
    buttons.accepted.connect(self.accept)
    buttons.rejected.connect(self.reject)
    layout.addWidget(buttons)
    self.datetime_emit.dateTimeChanged.connect(self.emit_signal)
  def emit_signal(self):
    date_str = self.datetime_emit.dateTime().toString()
    self.Signal_OneParameter.emit(date_str)

创建主窗口,调用对话框文件

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from jia_14多窗口信号传递之信号与槽 import DateDialog
class WinForm(QWidget):
  def __init__(self, parent=None):
    super(WinForm, self).__init__(parent)
    self.resize(400, 90)
    self.setWindowTitle('信号与槽传递参数的示例')
    self.open_btn = QPushButton('获取时间')
    self.lineEdit_inner = QLineEdit(self)
    self.lineEdit_emit = QLineEdit(self)
    self.open_btn.clicked.connect(self.openDialog)
    self.lineEdit_inner.setText('接收子窗口内置信号的时间')
    self.lineEdit_emit.setText('接收子窗口自定义信号的时间')
    grid = QGridLayout()
    grid.addWidget(self.lineEdit_inner)
    grid.addWidget(self.lineEdit_emit)
    grid.addWidget(self.open_btn)
    self.setLayout(grid)
  def openDialog(self):
    dialog = DateDialog(self)
    '''连接子窗口的内置信号与主窗口的槽函数'''
    dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
    '''连接子窗口的自定义信号与主窗口的槽函数'''
    dialog.Signal_OneParameter.connect(self.deal_emit_slot)
    dialog.show()
  def deal_inner_slot(self, date):
    self.lineEdit_inner.setText(date.toString())
  def deal_emit_slot(self, dateStr):
    self.lineEdit_emit.setText(dateStr)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  form = WinForm()
  form.show()
  sys.exit(app.exec_())

运行程序,效果如下

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

代码分析

下面代码表示,当空间datetime_emit的时间发生变化时,就会触发,子窗口的槽函数emit_signal,而在这个槽函数中又会发射自定义信号Signal_OneParameter,这个信号函数是为了传递date_str参数给主函数

    def emit_signal(self):

        date_str = self.datetime_emit.dateTime().toString()

        self.Signal_OneParameter.emit(date_str)

对于主窗口,关键是获取子窗口的信号,并把它绑定在自己的槽函数上,这样就实现了子窗口的控件与主窗口控件的绑定,核心代码如下

  def openDialog(self):

        dialog = DateDialog(self)

        '''连接子窗口的内置信号与主窗口的槽函数'''

        dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)

        '''连接子窗口的自定义信号与主窗口的槽函数'''

        dialog.Signal_OneParameter.connect(self.deal_emit_slot)

        dialog.show()

本文主要讲解了PyQt5窗口数据传递与PyQt5信号与槽多窗口数据传递详细使用方法与实例,更多关于PyQt5信号与槽的知识请查看下面的相关链接

Python 相关文章推荐
Python urlopen 使用小示例
Sep 06 Python
Python实现partial改变方法默认参数
Aug 18 Python
Python中列表(list)操作方法汇总
Aug 18 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
Python实现KNN邻近算法
Jan 28 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Python 实现简单的客户端认证
Jul 29 Python
Visual Studio code 配置Python开发环境
Sep 11 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 #Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 #Python
python输出第n个默尼森数的实现示例
Mar 08 #Python
Tensorflow之梯度裁剪的实现示例
Mar 08 #Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 #Python
Django 自定义404 500等错误页面的实现
Mar 08 #Python
Python loguru日志库之高效输出控制台日志和日志记录
Mar 07 #Python
You might like
PHP防止跨域提交表单
2013/11/01 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
node跨域请求方法小结
2017/08/25 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
python scipy卷积运算的实现方法
2019/09/16 Python
Python @property使用方法解析
2019/09/17 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
韩语专业本科生求职信
2013/10/01 职场文书
师范应届生语文教师求职信
2013/10/29 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
班干部演讲稿
2014/04/24 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
三八节活动简报
2015/07/20 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python