pyqt5窗口内嵌子窗口
1.示例图:
实现功能:
1.点击打开窗体实现子窗口内嵌主窗口展示
2.通过文件控件内的open控件导入文本内容在子窗口展示
3.通过文件控件内的close实现子窗口关闭
# -*- coding: utf-8 -*-
# Created by: PyQt5 UI code generator 5.6
# WARNING! All changes made in this file will be lost!
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget,QFileDialog
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(700,550)
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setGeometry(QtCore.QRect(70, 50, 491, 281))
self.textEdit.setObjectName("textEdit")
self.textEdit.setStyleSheet("background-color:#FFFFFF;color: rgb(0,0,0);font: 15pt \"AcadEref\";")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.textEdit.setText(_translate("Form", 'hello python'))
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(904, 621)
MainWindow.setStyleSheet("background-color: rgb(40, 112, 107);\n"
"color: rgb(255,255,255); \n"
"font: 15pt \"AcadEref\";\n"
)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(50, 10, 801, 511))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 904, 23))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
self.menu_2 = QtWidgets.QMenu(self.menubar)
self.menu_2.setObjectName("menu_2")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName("toolBar")
self.toolBar.setGeometry(QtCore.QRect(0, 20, 801, 31))
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.actionOpen = QtWidgets.QAction(MainWindow)
self.actionOpen.setObjectName("actionOpen")
self.actionSave = QtWidgets.QAction(MainWindow)
self.actionSave.setObjectName("actionSave")
self.actionNew = QtWidgets.QAction(MainWindow)
self.actionNew.setObjectName("actionNew")
self.actionClose = QtWidgets.QAction(MainWindow)
self.actionClose.setObjectName("actionClose")
self.addWinAction = QtWidgets.QAction(MainWindow)
self.addWinAction.setObjectName("addWinAction")
self.menu.addAction(self.actionOpen)
self.menu.addAction(self.actionSave)
self.menu.addAction(self.actionNew)
self.menu.addAction(self.actionClose)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.toolBar.addAction(self.addWinAction)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "文件"))
self.menu_2.setTitle(_translate("MainWindow", "编辑"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.actionOpen.setText(_translate("MainWindow", "open"))
self.actionOpen.setShortcut(_translate("MainWindow", "Alt+O"))
self.actionSave.setText(_translate("MainWindow", "save"))
self.actionNew.setText(_translate("MainWindow", "new"))
self.actionClose.setText(_translate("MainWindow", "close"))
self.addWinAction.setText(_translate("MainWindow", "打开窗体"))
self.addWinAction.setToolTip(_translate("MainWindow", "addwin"))
class MainFrom(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainFrom,self).__init__()
self.setupUi(self)
self.child = ChildrenReom()
self.actionOpen.triggered.connect(self.openMsg)
self.addWinAction.triggered.connect(self.childShow)
self.actionClose.triggered.connect(self.child_clearshow)
def openMsg(self):
try:
file,ok =QFileDialog.getOpenFileName(self,"打开",'./')
with open(file,'r') as f:
file_text=f.read()
self.child.textEdit.setText(file_text)
print('filepath',file)
except Exception as e:
print('请选择文档',e)
def childShow(self):
self.gridLayout.addWidget(self.child)
self.child.show()
def child_clearshow(self):
self.child.close()
class ChildrenReom(QMainWindow, Ui_Form):
def __init__(self):
super(ChildrenReom, self).__init__()
self.setupUi(self)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mywindow = MainFrom()
mywindow.show()
sys.exit(app.exec_())
二、展示容纳多文档的窗口
容纳多文档的 QMdiArea
多文档子窗口类 QMdiSubWindow
将QMdiSubWindow添加至QMdiArea中
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MultiDemo(QMainWindow):
count = 0
def __init__(self, parent=None):
super(MultiDemo, self).__init__(parent)
self.setWindowTitle("容纳多文档的窗口")
# 层叠,平铺
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New") # 新创建窗口
file.addAction("cascade") # 显示方式,层叠
file.addAction("Tiled") # 显示方式,平铺
file.triggered.connect(self.windowaction)
def windowaction(self, q):
print(q.text())
if q.text() == "New":
MultiDemo.count = MultiDemo.count + 1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("子窗口" + str(MultiDemo.count))
self.mdi.addSubWindow(sub)
sub.show()
elif q.text() == "cascade":
self.mdi.cascadeSubWindows()
elif q.text() == "Tiled":
self.mdi.tileSubWindows()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('./images/t10.ico'))
main = MultiDemo()
main.show()
sys.exit(app.exec_())
展示效果!
版权声明:本文为xinmo_jin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。