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使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Python----数据预处理代码实例
Mar 20 Python
Python可迭代对象操作示例
May 07 Python
python读写csv文件实例代码
Jul 05 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
pycharm无法安装cv2模块问题
May 20 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
Apache2 httpd.conf 中文版
2006/12/06 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
js数组的操作指南
2014/12/28 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
深入理解Node module模块
2018/03/26 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python实现把数字转换成中文
2015/06/29 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
小学生暑假感言
2014/02/06 职场文书
绿色出行口号
2014/06/18 职场文书
2015年党性分析材料
2014/12/19 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA