专栏首页Python编程 pyqt matplotlibPyQt5 多文档窗口界面

PyQt5 多文档窗口界面

本篇介绍多文档窗口界面的写法。代码中并未实现关闭窗口前文档未保存的提醒对话框,因为之前已有介绍。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QFont, QIcon, QKeySequence

class MdiSubWindow(QMdiSubWindow):
    def __init__(self):
        super(MdiSubWindow, self).__init__()
    def closeEvent(self, event):
        self.deleteLater()  #关闭后删除
        
class MainWindow(QMainWindow):
    
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        #self.setAttribute(Qt.WA_DeleteOnClose)
        
        self.mdi=QMdiArea()  #实例化Qmidarea区域
        self.setCentralWidget(self.mdi)   #设置为中央窗口部件
        self.createFileActions()
        
        menuBar=self.menuBar()  #实例化菜单栏
        file=menuBar.addMenu('File') #添加文件菜单
        #添加子菜单
        file.addAction(self.fileNewAction)
        file.addAction(self.separator)
        file.addAction(self.exitAction)
        self.windowMenu = menuBar.addMenu("&Window")   #添加窗口菜单
        self.windowMenu.aboutToShow.connect(self.updateWindowMenu)#用于动态更新菜
        #设置主窗口的标题
        self.setWindowTitle("多重文档界面示例")
        
    def createAction(self, text,icon=None,checkable=False,slot=None,tip=None,shortcut=None):
        action = QAction(text,self)
        if icon is not None:
            action.setIcon(QIcon(icon))
        if checkable:
            action.setCheckable(True)#可切换
            if slot is not None: action.toggled.connect(slot)
        else:
            if slot is not None: action.triggered.connect(slot)
        if tip is not None:
            action.setToolTip(tip)#工具栏提示
            action.setStatusTip(tip)#状态栏提示
        if shortcut is not None:
            action.setShortcut(shortcut)#快捷键
   
        return action
    def createFileActions(self): #创建文件相关动作
        
        #动作分隔符
        self.fileNewAction = self.createAction("&New",icon="filenew.png",checkable=False,
                                                slot=self.fileNew,tip="新建文件",shortcut=QKeySequence.New)
        self.separator  = QAction(self)
        self.separator.setSeparator(True)
        self.exitAction = self.createAction("E&xit",icon="",checkable=False,
                                                slot=self.close,tip="退出",shortcut=QKeySequence.Close)
    def fileNew(self):
        window =MdiSubWindow()   #实例化多文档界面对象
        window.setWidget(QTextEdit())   #设置sub内部部件
        window.setWindowTitle('subWindow %d' % len(self.mdi.subWindowList()))#设置新建子窗口的标题
        #print(sub.windowTitle())
        self.mdi.addSubWindow(window) #将子窗口添加到Mdi区域
        window.show()  #子窗口显示
        
    def updateWindowMenu(self):#动态显示窗口菜单
        self.windowMenu.clear() # 先清空已有的菜单项
        self.windowMenu.addAction('cascade')
        self.windowMenu.addAction('Tiled')
        self.windowMenu.addAction("Previous Window")
        self.windowMenu.addAction("Next Window")
        self.windowMenu.addSeparator()
        
        for window in self.mdi.subWindowList():
            action = self.windowMenu.addAction(window.windowTitle())
            action.setData(window)# 关联窗口和action
            
        self.windowMenu.addSeparator()
        self.windowMenu.addAction("close Active Window")
        self.windowMenu.addAction("close All Windows")
        
        #点击QAction绑定自定义的槽函数(传递有值【QAction】)
        self.windowMenu.triggered[QAction].connect(self.windowAction)
        
    def windowAction(self,q):
        if q.text()=='cascade':
            self.mdi.cascadeSubWindows()  #层叠显示
        elif q.text()=='Tiled':
            self.mdi.tileSubWindows()  #平铺显示
        elif q.text() == "Previous Window":
            self.mdi.activatePreviousSubWindow()
        elif q.text() == "Next Window":
            self.mdi.activateNextSubWindow()
        elif q.text() == "close Active Window":
            self.mdi.closeActiveSubWindow()   
        elif q.text() == "close All Windows":
            self.mdi.closeAllSubWindows()
        else: #激活窗口
            self.mdi.setActiveSubWindow(q.data())
        '''
        currentSubWindow(...)00
        setDocumentMode(self, bool)
        activateNextSubWindow(...)
        activatePreviousSubWindow(...)
        activeSubWindow(...)
        closeAllSubWindows(...)
        closeActiveSubWindow(...)
        removeSubWindow(self, QWidget)
        setActiveSubWindow(self, QMdiSubWindow)
        subWindowList(...)
        '''
        
if __name__ == '__main__':
    app=QApplication(sys.argv)
    mdi=MainWindow()
    mdi.show()
    sys.exit(app.exec_())

本文分享自微信公众号 - Python编程 pyqt matplotlib(wsplovePython),作者:wsp001

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PyQt5 非模态对话框(live 型)

    本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动...

    用户6021899
  • PyQt5 非模态对话框(apply 型)

    如果希望用户可以重复更改对话框中的参数并能马上看到修改结果,那么就要使用非模态对话框,这样用户就可以按照他们喜欢的方式来持续不断地修改数据并验证修改的结果了。

    用户6021899
  • PyQt5利用QPainter绘制各种图形[转发]

    传送点:https://www.cnblogs.com/hhh5460/p/4273799.html

    用户6021899
  • PyQt5 内嵌浏览器注入 Javas

    应同学邀请,演示如何使用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。

    py3study
  • python伪造udp数据包

    py3study
  • PyQt+SQLite构建一个简单的账号管理GUI程序

    相信有很多的测试同学,在日常的工作中都会需要去写一些辅助测试的小工具或者脚本,我们除了保证工具的可用性之外,有时还需要做一些图形界面上的开发以便在公司或者小组内...

    测试邦
  • 如醉如痴之最小堆

    一道简单的题,可以让你如醉如痴,更是因为这一道题,你才会学会很多,不要小看简单,简单中蕴含深意。

    公众号guangcity
  • 静态html提取正文的API和开源算法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    周小董
  • 性能测试: Python3 利用asynico协程系统构建生产消费模型

    今天研究了下python3的新特性 asynico ,试了试 aiohttp 协程效果,单核QPS在500~600之间,性能还可以。

    机械视角
  • PyQT5 图片查看器

    由官方PyQt4 demo升级为PyQt5版本,原本只有缩放功能,现另加入打印和拖放功能。

    用户6021899

扫码关注云+社区

领取腾讯云代金券