本篇介绍PyQt5的多窗口应用,在设计程序界面时候,经常会用到多窗口界面。
新建两个窗口
一个主窗口QMainWindow,一个QWidget。在主窗口中放入一个QTabWidget作为窗体的容器,没有子窗体时候QTabWidget不会显示。在子窗体中放入一个QPlainText文本显示控件,显示文本内容。
主窗体设计
- paintEvent(self, event):重写paintEvent时间,当窗口大小发生改变时候,自动重新绘制背景图片。
- taWidget_tabCloseRequest(self, index):关闭QTableWidget中的一个窗口。每个窗口都有一个不同的索引index,可以通过不同的index来切换或者删除界面。
- actDockWidget_triggered(self):嵌入窗口按钮的槽函数,先实例化一个Form,直接在QTabWidget添加界面tab,这个方法是让子窗体显示在QTableWidget控件中。
- actSeqWidget_triggered(self):独立的窗口按钮槽函数。用show()来显示窗口。newForm1.setWindowOpacity(0.9)是用来显示窗口的透明度。
class MainWindow(QMainWindow, Ui_MainWindow): currentPath = os.getcwd() def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.tabWidget.setVisible(False) self.tabWidget.clear() self.tabWidget.setTabsClosable(True) self.tabWidget.setDocumentMode(True) # self.setWindowState(Qt.WindowMaximized) self.setAutoFillBackground(True) self.background = QPixmap(self.currentPath+"Images4.jpg") self.tabWidget.tabCloseRequested.connect(self.taWidget_tabCloseRequest) self.actDockWidget.triggered.connect(self.actDockWidget_triggered) self.actSepWidget.triggered.connect(self.actSeqWidget_triggered) def paintEvent(self, event): painter = QPainter(self) painter.drawPixmap(0, self.toolBar.height(), self.width(), self.height()-self.toolBar.height() -self.statusBar().height(), self.background) super(MainWindow, self).paintEvent(event) def tabWidget_indexChanged(self): tabExist = self.tabWidget.count() > 0 self.tabWidget.setVisible(tabExist) def taWidget_tabCloseRequest(self, index): if index >= 0: form = self.tabWidget.widget(index) form.close() else: return def actDockWidget_triggered(self): try: newForm1 = Form1(self) newForm1.setAttribute(Qt.WA_DeleteOnClose) newForm1.fileOpen.connect(self.fileChanged) title = "page %d" % self.tabWidget.count() curIndex = self.tabWidget.addTab(newForm1, title) self.tabWidget.setCurrentIndex(curIndex) self.tabWidget.setVisible(True) except Exception as e: print(e) def fileChanged(self, fileName): index = self.tabWidget.currentIndex() self.tabWidget.setTabText(index, fileName) def actSeqWidget_triggered(self): newForm1 = Form1(self) newForm1.setAttribute(Qt.WA_DeleteOnClose) newForm1.setWindowTitle("独立的窗口") newForm1.setWindowFlag(Qt.Window, True) newForm1.setWindowOpacity(0.9) newForm1.show()
子窗体设计
- initForm(self):Form1是继承了QWidget类,在UI Designer中无法通过工具栏来添加Action,只能通过代码创建Action。
- actOpen_triggered(self):本篇只演示一个打开文件的案例,其余的可参考以前的Demo,这里不做过多的赘述。读取一个txt或者py文件。
class Form1(QWidget): currentPath = os.getcwd() fileOpen = pyqtSignal(str) def __init__(self, parent=None): super(Form1, self).__init__(parent) self.form1 = Ui_Form1() self.form1.setupUi(self) self.initForm() self.form1.actOpen.triggered.connect(self.actOpen_triggered) def initForm(self): toolBar = QToolBar("文档编辑", self) toolBar.addAction(self.form1.actOpen) toolBar.addAction(self.form1.actFont) toolBar.addSeparator() toolBar.addAction(self.form1.actCut) toolBar.addAction(self.form1.actCopy) toolBar.addAction(self.form1.actPaste) toolBar.addSeparator() toolBar.addAction(self.form1.actRedo) toolBar.addAction(self.form1.actUndo) toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) layout = QVBoxLayout() layout.addWidget(toolBar) layout.addWidget(self.form1.plainTextEdit) layout.setContentsMargins(2, 2, 2, 2) layout.setSpacing(2) self.setLayout(layout) def actOpen_triggered(self): file, flt = QFileDialog.getOpenFileName(self, "打开一个文件", self.currentPath, "文本文件(*.txt, *.py)") if file == "": return self.form1.plainTextEdit.clear() openFile = open(file, 'r', encoding='UTF-8') for i in openFile: self.form1.plainTextEdit.appendPlainText(i.strip()) font = self.form1.plainTextEdit.font() font.setPointSize(10) self.form1.plainTextEdit.setFont(font) baseFileName = os.path.basename(file) self.setWindowTitle(baseFileName) self.fileOpen.emit(baseFileName)
运行一下
一个简单的案例介绍多窗口的使用,如果需要源代码可关注私聊,感谢支持!!!!