多窗口应用程序

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

猜你喜欢

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