MDI应用程序设计

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

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/108432723