链接:https://pan.baidu.com/s/1Ol_eKXZ9HXePfvB08xl6fQ
提取码:qy07
action的checkable不能忘记点了。
myMainWindow.py
import sys,os
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog,QMdiArea
from PyQt5.QtCore import pyqtSlot,Qt
from PyQt5 import QtCore
from ui_mainwindow import Ui_MainWindow
from myFormDoc import QmyFormDoc
class QmyMainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)#调用父类构造函数,创建窗体
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
self.setCentralWidget(self.ui.mdiArea)#填充整个区域
self.ui.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
#=================事件处理函数===========
def closeEvent(self, event):
self.ui.mdiArea.closeAllSubWindows()#关闭所有子窗口
event.accept()
@pyqtSlot()#新建文档
def on_actDocNew_triggered(self):
formDoc=QmyFormDoc(self)
self.ui.mdiArea.addSubWindow(formDoc)#添加文档窗口到MDI
formDoc.show()#显示窗口
self.__enableEditActions(True)
def __enableEditActions(self,enabled):
self.ui.actEditCut.setEnabled(enabled)
self.ui.actEditCopy.setEnabled(enabled)
self.ui.actEditPaste.setEnabled(enabled)
self.ui.actEditFont.setEnabled(enabled)
@pyqtSlot()##打开文档
def on_actDocOpen_triggered(self):
needNew=False#是否需要新建子窗口
if(len(self.ui.mdiArea.subWindowList())>0):#如果有子窗口
formDoc=self.ui.mdiArea.activeSubWindow().widget()#获取活动子窗口
needNew=formDoc.isFileOpened()#文件已经打开,则需要新建一个窗口存放新内容
else:
needNew=True
curPath=os.getcwd()#获取当前路径
filename,flt=QFileDialog.getOpenFileName(self,"打开一个文件",curPath,"文本文件(*.cpp *.h *.py);所有文件(*.*)")
if(filename==""):
return
if(needNew):#需要新建MDI子窗口
formDoc=QmyFormDoc(self)#必须指定父窗口
self.ui.mdiArea.addSubWindow(formDoc)#添加到MDI区域
formDoc.loadFromFile(filename)#载入文件
formDoc.show()
self.__enableEditActions(True)
@pyqtSlot()#级联展开
def on_actMDICascade_triggered(self):
self.ui.mdiArea.cascadeSubWindows()
@pyqtSlot()#平铺展开
def on_actMDITile_triggered(self):
self.ui.mdiArea.tileSubWindows()
@pyqtSlot()#关闭全部
def on_actDocCloseAll_triggered(self):
self.ui.mdiArea.closeAllSubWindows()
@pyqtSlot(bool)#MDI模式
def on_actMDIMode_triggered(self,checked):
if(checked):#tab多页显示模式
self.ui.mdiArea.setViewMode(QMdiArea.TabbedView)#tab多页模式
self.ui.mdiArea.setTabsClosable(True)#页面可关闭
self.ui.actMDICascade.setEnabled(False)
self.ui.actMDITile.setEnabled(False)
else:#子窗口模式
self.ui.mdiArea.setViewMode(QMdiArea.SubWindowView)#子窗口模式
self.ui.actMDICascade.setEnabled(True)
self.ui.actMDITile.setEnabled(True)
'''
QMdiArea有一个信号subWindowActivated(),在当前活动窗口变化时发射。
利用此信号在活动窗口切换时进行一些处理,例如,在状态栏里显示活动MDI子窗口的文件名,
在没有MDI子窗口时,将工具栏上的编辑功能按钮设置为禁用
'''
def on_mdiArea_subWindowActivated(self,arg1):
cnt=len(self.ui.mdiArea.subWindowList())
if(cnt==0):
self.__enableEditActions(False)
self.ui.statusbar.clearMessage()
else:
formDoc=self.ui.mdiArea.activeSubWindow().widget()
self.ui.statusbar.showMessage(formDoc.currentFileName())
@pyqtSlot()#剪切操作
def on_actEditCut_triggered(self):
formDoc=self.ui.mdiArea.activeSubWindow().widget()
formDoc.textCut()
@pyqtSlot()#复制操作
def on_actEditCopy_triggered(self):
formDoc=self.ui.mdiArea.activeSubWindow().widget()
formDoc.textCopy()
@pyqtSlot()#粘贴操作
def on_actEditPaste_triggered(self):
formDoc=self.ui.mdiArea.activeSubWindow().widget()
formDoc.textPaste()
@pyqtSlot()#字体设置
def on_actEditFont_triggered(self):
formDoc=self.ui.mdiArea.activeSubWindow().widget()
formDoc.textSetFont()
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,codecs,os
from PyQt5.QtWidgets import QApplication,QWidget,QFontDialog
from PyQt5.QtCore import Qt
from ui_qwformdoc import Ui_QWFormDoc
class QmyFormDoc(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui=Ui_QWFormDoc()
self.ui.setupUi(self)
self.setWindowTitle("New Doc")
# self.setAttribute(Qt.WA_DeleteOnClose)##MDI窗口会被自动删除
self.__currentFile=""#当前文件名
self.__fileOpened=False#是否已打开文件
def __del__(self):
print("QmyFormDoc对象被删除了")
##==============自定义功能函数==============
def loadFromFile(self,aFileName):#打开文件
aFile=codecs.open(aFileName,encoding='utf-8')
try:
for eachLine in aFile:#每次读取一行
self.ui.plainTextEdit.appendPlainText(eachLine.strip())
finally:
aFile.close()
self.__currentFile=aFileName
self.__fileOpened=True
baseFileName=os.path.basename(aFileName)#去掉目录后的文件名
self.setWindowTitle(baseFileName)
def currentFileName(self):#返回当前文件名
return self.__currentFile
def isFileOpened(self):#文件是否打开
return self.__fileOpened
def textCut(self):#剪切操作
self.ui.plainTextEdit.cut()
def textCopy(self):#复制操作
self.ui.plainTextEdit.copy()
def textPaste(self):#粘贴操作
self.ui.plainTextEdit.paste()
def textSetFont(self):#设置字体
iniFont=self.ui.plainTextEdit.font()
font,OK=QFontDialog.getFont(iniFont)
if(OK):#选择有效
self.ui.plainTextEdit.setFont(font)