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操作sqlite的CRUD实例分析
May 08 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Tensorflow之Saver的用法详解
Apr 23 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
python pandas生成时间列表
Jun 29 Python
Golang GBK转UTF-8的例子
Aug 26 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
python 6行代码制作月历生成器
Sep 18 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
Python中zipfile压缩包模块的使用
May 14 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 采集心得技巧
2009/05/15 PHP
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php格式化金额函数分享
2015/02/02 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
document.createElement()用法
2013/03/13 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
angularJS 入门基础
2015/02/09 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
详解Python3 pickle模块用法
2019/09/16 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
美国在线印刷公司:PsPrint
2017/10/12 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
小学教师学期末自我评价
2013/09/25 职场文书
品牌推广策划方案
2014/05/28 职场文书
体育教师求职信
2014/06/30 职场文书
护士实习自荐信
2015/03/06 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
音乐剧猫观后感
2015/06/04 职场文书
五年级作文之想象作文
2019/10/30 职场文书
python 调用js的四种方式
2021/04/11 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL