多窗口应用程序

tech2026-01-16  7

链接:https://pan.baidu.com/s/1TlUYGF3ZTvVS6a9Rj79opg  提取码:yds3

myMainWindow.py

import sys from PyQt5.QtWidgets import QApplication,QMainWindow from PyQt5.QtCore import pyqtSlot,Qt from PyQt5.QtGui import QPainter,QPixmap from PyQt5 import QtCore from ui_mainwindow import Ui_MainWindow from myFormDoc import QmyFormDoc from myFormTable import QmyFormTable class QmyMainWindow(QMainWindow): def __init__(self,parent=None): super().__init__(parent) self.ui=Ui_MainWindow() self.ui.setupUi(self) self.ui.tabWidget.setVisible(False) self.ui.tabWidget.clear()#清除所有界面 self.ui.tabWidget.setTabsClosable(True)#page有关闭按钮 self.ui.tabWidget.setDocumentMode(True) self.setCentralWidget(self.ui.tabWidget) self.setWindowState(Qt.WindowMaximized)#窗口最大化显示 self.setAutoFillBackground(True)#自动绘制背景 self.__pic=QPixmap("seal.jpg")#载入北京图片到内存,提高绘制速度 #===============事件处理函数=============== def paintEvent(self,event): painter=QPainter(self) painter.drawPixmap(0,self.ui.toolbar.height(),self.width(),self.height()-self.ui.toolbar.height()-self.ui.statusbar.height(),self.__pic) super().paintEvent(event) ##=====由connectSlotByName()自动关联的槽函数 def on_tabWidget_currentChanged(self,index):##tabWidget当前界面变化 hasTabs=self.ui.tabWidget.count()>0#页面个数 self.ui.tabWidget.setVisible(hasTabs) def on_tabWidget_tabCloseRequested(self,index):##分页关闭时关闭窗体 if(index<0): return aForm=self.ui.tabWidget.widget(index) aForm.close() @pyqtSlot()##嵌入式Widget按钮 def on_actWidgetInside_triggered(self): formDoc=QmyFormDoc(self) formDoc.setAttribute(Qt.WA_DeleteOnClose)#关闭时自动删除 formDoc.docFileChanged.connect(self.do_docFileChanged) title="Doc %d"%self.ui.tabWidget.count() curIndex=self.ui.tabWidget.addTab(formDoc,title)#添加到tabWidget self.ui.tabWidget.setCurrentIndex(curIndex) self.ui.tabWidget.setVisible(True) @pyqtSlot(str) def do_docFileChanged(self,shotFilename): index=self.ui.tabWidget.currentIndex() self.ui.tabWidget.setTabText(index,shotFilename)#显示文件名 @pyqtSlot()#独立widget窗口按钮 def on_actWidget_triggered(self): formDoc=QmyFormDoc(self)#必须传递self,否则无法显示 formDoc.setAttribute(Qt.WA_DeleteOnClose) formDoc.setWindowFlag(Qt.Window,True) formDoc.setWindowOpacity(0.9)#窗口透明度 formDoc.show() @pyqtSlot()##嵌入式MainWindow def on_actWindowInside_triggered(self): formTable=QmyFormTable(self) formTable.setAttribute(Qt.WA_DeleteOnClose) title="Table %d"%self.ui.tabWidget.count() curIndex=self.ui.tabWidget.addTab(formTable,title) self.ui.tabWidget.setCurrentIndex(curIndex) self.ui.tabWidget.setVisible(True) @pyqtSlot()#独立的MainWindow窗口 def on_actWindow_triggered(self): formTable=QmyFormTable(self)#必须传递self,否则无法显示 formTable.setAttribute(Qt.WA_DeleteOnClose) formTable.setWindowTitle("基于QMainWindow的窗口,关闭时删除") formTable.show() if __name__=="__main__": QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放 app=QApplication(sys.argv) form=QmyMainWindow() form.show() sys.exit(app.exec_())

myFormDoc.py

import sys,os from PyQt5.QtWidgets import (QApplication,QWidget,QFileDialog,QToolBar,QVBoxLayout,QFontDialog) from PyQt5.QtCore import pyqtSlot,pyqtSignal,Qt from PyQt5.QtGui import QPalette,QFont from ui_qwformdoc import Ui_QWFormDoc class QmyFormDoc(QWidget): docFileChanged=pyqtSignal(str)#自定义信号,打开文件时发射 def __init__(self, parent=None): super().__init__(parent) self.ui=Ui_QWFormDoc() self.ui.setupUi(self) self.__curFile=""#当前文件名 self.__buildUI()#构建工具栏 self.setAutoFillBackground(True) def __del__(self):#析构函数 print("QmyFormDoc对象被删除了") def __buildUI(self):#使用UI可视化设计的action创建工具栏 locToolBar=QToolBar("文档",self)#创建工具栏 locToolBar.addAction(self.ui.actOpen) locToolBar.addAction(self.ui.actFont) locToolBar.addSeparator() locToolBar.addAction(self.ui.actCut) locToolBar.addAction(self.ui.actCopy) locToolBar.addAction(self.ui.actPaste) locToolBar.addAction(self.ui.actUndo) locToolBar.addAction(self.ui.actRedo) locToolBar.addSeparator() locToolBar.addAction(self.ui.actClose) locToolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) Layout=QVBoxLayout() Layout.addWidget(locToolBar) Layout.addWidget(self.ui.plainTextEdit) Layout.setContentsMargins(2,2,2,2)#减小边框的宽度 Layout.setSpacing(2) self.setLayout(Layout)#设置布局 #=========有connectSlotByName()自动关联的槽函数========= @pyqtSlot()#打开文件 def on_actOpen_triggered(self): curPath=os.getcwd()#获取当前路径 filename,flt=QFileDialog.getOpenFileName(self,"打开一个文件",curPath,"文本文件(*.cpp *.h *.py);所有文件(*.*)") if(filename==""): return self.__curFile=filename self.ui.plainTextEdit.clear() aFile=open(filename,'r',encoding="utf-8") try: for eachLine in aFile:#每次读取一行 self.ui.plainTextEdit.appendPlainText(eachLine.strip()) finally: aFile.close() baseFilename=os.path.basename(filename)#去掉目录后的文件名 self.setWindowTitle(baseFilename) self.docFileChanged.emit(baseFilename)#发射信号,传递文件名 @pyqtSlot()#选择字体 def on_actFont_triggered(self): iniFont=self.ui.plainTextEdit.font() font,OK=QFontDialog.getFont(iniFont) if(OK):#选择有效 self.ui.plainTextEdit.setFont(font)

myFormTable.py

 

import sys from PyQt5.QtWidgets import (QApplication,QMainWindow,QLabel,QAbstractItemView,QDialog) from PyQt5.QtCore import pyqtSlot,Qt,QItemSelectionModel from PyQt5.QtGui import QStandardItemModel from ui_qwformtable import Ui_QWFormTable from myDialogSize import QmyDialogSize from myDialogHeaders import QmyDialogHeaders class QmyFormTable(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.ui=Ui_QWFormTable() self.ui.setupUi(self) self.__dlgSetHeaders=None#表头设置对话框 self.setAutoFillBackground(True) self.setCentralWidget(self.ui.tableView) self.ui.tableView.setAlternatingRowColors(True) ##构建model/view self.itemModel=QStandardItemModel(5,3,self)#数据模型 self.selectionModel=QItemSelectionModel(self.itemModel) self.ui.tableView.setModel(self.itemModel)#设置数据模型 self.ui.tableView.setSelectionModel(self.selectionModel) def __del__(self):#析构函数 print("QmyFormTable对象被删除了") ##============由connectSlotByName()自动关联的槽函数===== @pyqtSlot()#设置表格大小 def on_actSetSize_triggered(self): dlgTableSize=QmyDialogSize()#局部变量,构建时不能传递self dlgTableSize.setIniSize(self.itemModel.rowCount(),self.itemModel.columnCount()) ret=dlgTableSize.exec() if(ret==QDialog.Accepted): rows,cols=dlgTableSize.getTableSize() self.itemModel.setRowCount(rows) self.itemModel.setColumnCount(cols) @pyqtSlot()#设置表头标题 def on_actSetHeader_triggered(self): if(self.__dlgSetHeaders==None): self.__dlgSetHeaders=QmyDialogHeaders(self) count=len(self.__dlgSetHeaders.headerList()) if(count!=self.itemModel.columnCount()): strList=[] for i in range(self.itemModel.columnCount()): text=str(self.itemModel.headerData(i,Qt.Horizontal,Qt.DisplayRole)) strList.append(text) self.__dlgSetHeaders.setHeaderList(strList) ret=self.__dlgSetHeaders.exec() if(ret==QDialog.Accepted): strList2=self.__dlgSetHeaders.headerList() self.itemModel.setHorizontalHeaderLabels(strList2)

最新回复(0)