链接: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)