【写在前面】

自学python,不同于工作上的代码编程,主要是为了好玩或者满足自己的需求。因此,我一直想自己做些APP,未来可以给小朋友做做练习,比如让她学习算术、学习成语接龙之类的。总不能让她看这样恐怖的界面吧?

因此,就自学GUI,可以制作些可视化界面工具。

另外,我在制作GUI时,发现多窗口之间的信号传递和处理特别麻烦,网上有很多C或者JAVA的帖子,或者只有 介绍如何显示多窗口,但是就是没有详细的Python介绍如何实现信号传递。因此也希望这篇文章有点用吧!

【示例代码】

示例代码一共有2份,一份是主窗口的代码 ,一份是子窗口的代码。

MainWindow.py

# coding=utf-8# @Auther : "鹏哥贼优秀"# @Date : 2019/8/16# @Software : PyCharmfrom PyQt5 import QtCore, QtGui, QtWidgetsimport sysfrom ChildWindow import *class Ui_MainWindow(QtWidgets.QMainWindow):def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(534, 386)self.pushButton = QtWidgets.QPushButton(Dialog)self.pushButton.setGeometry(QtCore.QRect(360, 140, 101, 51))self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);\n""font: 12pt \"黑体\";")self.pushButton.setObjectName("pushButton")self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)self.plainTextEdit.setGeometry(QtCore.QRect(50, 120, 271, 161))self.plainTextEdit.setStyleSheet("font: 11pt \"宋体\";")self.plainTextEdit.setObjectName("plainTextEdit")self.label = QtWidgets.QLabel(Dialog)self.label.setGeometry(QtCore.QRect(60, 85, 131, 21))self.label.setStyleSheet("font: 12pt \"黑体\";\n""color: rgb(255, 0, 0);")self.label.setObjectName("label")self.retranslateUi(Dialog)QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "Dialog"))self.pushButton.setText(_translate("Dialog", "弹出子窗口"))self.label.setText(_translate("Dialog", "显示子窗口内容"))self.pushButton.clicked.connect(self.btn)# 在主窗口点击按钮后,显示子窗口def btn(self):self.child = QtWidgets.QDialog()self.childwindow = Ui_ChildWindow()self.childwindow.setupUi(self.child)# 与子窗口的信号连接self.childwindow.my_signal.connect(self.child_click)self.child.show()# 定义子窗口的按钮作用def child_click(self):value = self.childwindow.plainTextEdit.toPlainText()print(value)self.childwindow.plainTextEdit.setPlainText("子窗口输入成功!")self.plainTextEdit.setPlainText(value)if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)main = QtWidgets.QMainWindow()mainwindow = Ui_MainWindow()mainwindow.setupUi(main)main.show()sys.exit(app.exec())

ChildWindow.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'ChildWindow.ui'## Created by: PyQt5 UI code generator 5.11.3## WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_ChildWindow(QtWidgets.QDialog):# 声明信号my_signal = QtCore.pyqtSignal(str)def setupUi(self, Dialog):Dialog.setObjectName("Dialog")Dialog.resize(565, 413)self.pushButton = QtWidgets.QPushButton(Dialog)self.pushButton.setGeometry(QtCore.QRect(400, 120, 75, 51))self.pushButton.setStyleSheet("font: 12pt \"黑体\";\n""background-color: rgb(0, 255, 127);")self.pushButton.setObjectName("pushButton")self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)self.plainTextEdit.setGeometry(QtCore.QRect(90, 110, 261, 111))self.plainTextEdit.setStyleSheet("font: 12pt \"宋体\";")self.plainTextEdit.setObjectName("plainTextEdit")self.retranslateUi(Dialog)QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):_translate = QtCore.QCoreApplication.translateDialog.setWindowTitle(_translate("Dialog", "Dialog"))self.pushButton.setText(_translate("Dialog", "输入"))self.pushButton.clicked.connect(self.click)# 信号传递回主窗口并结束def click(self):self.my_signal.emit("1")

【效果】

【知识点】

1、多窗口实现流程:

(1)用QT Designer直接先设计好主、子窗口的界面布局及按钮制作(如何使用Qt Designer,这块知识网上 有很多,暂不介绍了)

(2)在子窗口中,定义窗口的信号,及定义好信号发送后的退出方式。

关键就是以下几句代码:

因为我定义了my_signal信号,并且要求发送str作为信号的结束。因此在click方法中,定义成了my_signal.emit("1")。表示这个信号发送了“1”给主窗口,并结束。但其实,这个地方“1”并没有什么意义,因为我只是需要多窗口之间的信号连接,不关心最后子窗口给我返回的是什么。

(3)主窗口这边就有2个功能要实现了。

一方面除了显示主窗口界面外,还要在点击按钮后显示子窗口界面,如下图:

这 段代码还 是好理解的,在点击主窗口按钮后,调用窗口显示流程代码 + 一句与子窗口信号连接的代码 。但其实这段 代码就是多窗口实现的核心代码。刚开始学习的时候,就是这段流程不 熟悉,所以一直碰壁。

说明:

其实子窗口与主窗口显示的代码流程是一样的,只是子窗口属于QDialog类,主窗口属于QMainWindow类布局。

因为信号连接的代码是表示子窗口点击了按钮后,程序应当进入child_click方法。

下面就是子窗口按钮响应的实现了。

具体功能就是根据各自需求实现了。

2、别以为 上面这样就可以了,但是 有个坑 :

如果是通过Qt Designer实现代码转换的话,类定义一般是:

classUi_MainWindow(object):

发现没,一般是不会声明具体继承什么类,导致主、子窗口的类继承冲突(这里我对类继承也不太熟悉,不知道要怎么解释)。查过网上的一些资料,说主、子窗口的类型不能一样,即不能都为QDialog,所以要把各个类声明好,具体是继承什么类的。即如下:

classUi_MainWindow(QtWidgets.QMainWindow):

3、聊聊多窗口数据传递的方法。

我当前想到有3个办法 可以实现多窗口信号传递。

(1)子窗口将要传递的信号,写到一个临时文件中,然后主窗口读取临时文件。这个就是文件读写的操作了,但是比较土。

(2)在主窗口中,获取到子窗口内的信号。本文采用的就是这种方法。

(3)在子窗口中,直接把主 窗口的内容进行修改。理论上应该只要继承父类就可以了 ,如下

importMainWindow

classUi_ChildWindow(MainWindow.Ui_MainWindow):

但是可能是 我使用方式有问题,无法访问父类的对象,即无法获取 到父类的Pushbutton按钮。等我本事再提高些,再回来解决这个问题。

【写在最后】

如果觉得不错,关注我公众号“鹏哥贼优秀”呀!

python槽怎么用_【Python成长之路】从零学GUI -- 多窗口跳转(信号与槽函数用法)...相关推荐

  1. python qt designer 重定向_[Python自学] PyQT5-QTDesigner中关联信号和槽

    一.什么是信号什么是槽 信号和槽是QT的核心机制. 1.信号 信号,是由对象或空间发出去的消息.例如单击按钮控件. 信号可以理解为触发的事件. 2.槽 发送出去的信号需要有一段代码来拦截,并执行一些操 ...

  2. Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

    有时候在项目开发时,经常会遇到一些耗时操作导致界面迟缓卡顿,为了解决这个问题,可以创建多线程,使用主线程更新界面使用子线程实时处理数据,最后将结果显示到界面上. PyQt多线程将使用QThread函数 ...

  3. python多进程编程实例_[python] Python多进程编程技术实例分析

    这篇文章主要介绍了Python多进程编程技术,包括了线程.队列.同步等概念及相关的技巧总结,需要的朋友可以参考下 本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧. ...

  4. python查看excel编码格式_[Python]实现处理读写xlsx xls excel文件格式(含中文处理方法)...

    最近有个需求要处理excel 格式的数据,数据量比较大.用传统的语言似乎不太好处理,于是改用python实现,这里记录一下实现过程. 首先,科普一下xlsx xls的excel文件区别是什么. xls ...

  5. python快速爬虫视频_“python怎么快速爬虫视频“python 爬网页视频教程

    用python怎样爬网页 # coding:utf8 import cookielib import urllib2 url = "http://blog.uouo123.com" ...

  6. python朋友圈刷屏_“Python太火了!请救救Java!”9万程序员刷屏朋友圈 !

    没想到有生之年,笔者能观察到"霸主陨落"的过程,继PLPY4月榜单官宣,Python躺赢,再度"夺"冠,实力甩下Java和C后,近期,Stack Overflo ...

  7. python 打包 小文件_[Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件

    1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...

  8. 一文带你学习从Python初学者到进阶的代码成长之路(初级)

    收藏!长文!从Python小白到大牛,要走的路这里都有 面向项目的学习是学习编码的最佳方法.Python是当今最需求的语言,为了帮助您学习它,以下是一些您可以探索的最重要的Python项目: Pyth ...

  9. python希腊字母怎么生成_#python sympy怎样把狄克拉函数定义出来#

    Python sympy用integrate解定积分出来的结果不是计算完的结果 ## 数值积分 sympy下的integrate()函数是解析积分,当被积函数不存在原函数时则无法得到节分结果.所以建议 ...

最新文章

  1. 自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错
  2. 云视频会议的“多、快、好、省”(下)
  3. SQL查询系列之六:SQL模糊查询
  4. 随机信号通过带通滤波器
  5. TCP 中粘包的产生和解决
  6. 个人遇到局域网不能访问解决分享
  7. 手把手教你如何下载大厂页面的字体——开发
  8. 11.22Daily Scrum(2)
  9. A Brief Overview Of Vulkan API
  10. rtsp实时流通过rtmp推送到服务端
  11. WCF开发实战系列四:使用Windows服务发布WCF服务
  12. dmg文件转换iso ultraiso_Ultraiso软盘如何制作U盘启动盘
  13. EasyX画动态时钟
  14. 使用BatteryHistorian分析和优化应用电量
  15. win10子系统ubuntu WSL下无法用git下载代码
  16. STM32F103驱动THM3060读取二代身份证
  17. 总结:VC小知识!(网上找的)
  18. 免听选考c语言程序设计难,2020春C语言程序设计(江俊君)-中国大学mooc-题库零氪...
  19. winpe 能否修复服务器系统盘,U盘启动盘winpe修复系统的技巧
  20. 电磁兼容设计中无法忽视的高频效应

热门文章

  1. java有哪些技术_Java程序员,最常用的20%技术有哪些?
  2. ibm服务器维修站点,IBM 服务器维修
  3. qt designer 自定义插件找不到指定的模块_go与qt的新酒老瓶
  4. 5m独享网站服务器,您真的需要独享5m云服务器吗?一文让您了解云服务器带宽计算方法,从此不再花冤枉钱...
  5. 如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句
  6. SpringMVC 的总结
  7. 使用jemalloc在Go中进行手动内存管理
  8. Linux驱动开发流程四步走
  9. Linux驱动开发快速参考
  10. 版本为2.5的OpenMP规范中的编译制导指令汇总