PyQt5调用子窗口
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5调用子窗口相关的知识,希望对你有一定的参考价值。
作为一个非QT的专业认识,但是工作中用的它开发一些内部使用的工具,时间短,没有很多的时间去研究QT,所以设计UI的时候需要用QtDesigner去设计就好,让我自己在代码中手敲代码去布局那是十分难的,特别是调用子面板的时候,总是手敲布局代码,后来学习到了,博客记录下过程。
——————————————————————————————————————————
最终想实现的就是如下图所示:
测试软件环境:
python3.8 x64
pycharm
pyqt5 5.16防止copy 出错,源码我放在了Git上,有需自取
1,新建一个主窗口UI : main_ui.ui
2,新建一个子窗口UI , 类型选择 Diaglog 类型 sub_diaglou_ui.ui
3,生成main_ui.py 和 sub_diaglou_ui.py文件,这里如果没有外部工具,怎么添加外部工具,可以参考下一步骤
4,外部工具的设置
5 ,main_call_sub_ui.py 代码如下:
真正的是UI文件和主main文件分离,每次更新UI,只需要不断的更新UI文件就可以了
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog
from main_ui import Ui_MainWindow
from sub_diaglou_ui import Ui_Dialog
class ShowDialog(QDialog, Ui_Dialog): # 子面板
def __init__(self, parent=None):
super(ShowDialog, self).__init__(parent)
self.setupUi(self) # 调用写在视图层文件的页面布局函数
def closeEvent(self, event):
print("closed dialog")
class MainQt(QMainWindow,Ui_MainWindow): # 主面板
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.show_diaglog)
def show_diaglog(self):
print("call sub panel")
dlg = ShowDialog(self)
dlg.exec_()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mian_ui = MainQt()
mian_ui.show()
sys.exit(app.exec_())
6,最后汇总下 print 函数重定向和子面板调用,基本结构如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDialog
from PyQt5.QtGui import QTextCursor
from PyQt5.QtCore import QObject, pyqtSignal
from main_ui import Ui_MainWindow
from sub_diaglou_ui import Ui_Dialog
from nprintf import nprintf
temp = sys.stdout
class Stream(QObject):
newText = pyqtSignal(str)
def write(self, text):
self.newText.emit(str(text))
QApplication.processEvents()
class ShowDialog(QDialog, Ui_Dialog): # Python多继承
def __init__(self, parent=None):
super(ShowDialog, self).__init__(parent)
self.setupUi(self) # 调用写在视图层文件的页面布局函数
def closeEvent(self, event):
nprintf("closed dialog")
class MainQt(QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
'''流重定向'''
sys.stdout = Stream(newText=self.onUpdateEdit)
self.pushButton.clicked.connect(self.print_test)
self.pushButton_2.clicked.connect(self.show_diaglog)
def print_test(self):
nprintf("这是文件main.py")
from becalled_a import print_a
from becalled_b import print_b
print_a()
print_b()
def show_diaglog(self):
nprintf("call sub panel")
dlg = ShowDialog(self)
dlg.exec_()
'''关闭app事件响应'''
def closeEvent(self, event):
"""Shuts down application on close."""
# Return stdout to defaults.
self.ms.close()
sys.stdout = temp
super().closeEvent(event)
'''绑定输出流'''
def onUpdateEdit(self, text):
cursor = self.textEdit.textCursor()
cursor.movePosition(QTextCursor.End)
cursor.insertText(text)
self.textEdit.setTextCursor(cursor)
self.textEdit.ensureCursorVisible()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mian_ui = MainQt()
mian_ui.show()
sys.exit(app.exec_())
感谢欣赏,如有帮助,点赞留香 |
以上是关于PyQt5调用子窗口的主要内容,如果未能解决你的问题,请参考以下文章