Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

一个典型的GUI应用程序可能有多个窗口,选项卡控件和堆栈窗口控件允许一次使用其中的一个窗口。然而,很多时候这种方法不是很有用,因为其他窗口的视图是隐藏的一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Single Document Interface,单文档界面),每个窗口都可以有自己的菜单系统、工具栏等。这需要占用较多的内存资源。

MDI (Multiple Document Interface,多文档界面)应用程序占用较少的内存资源,子窗口都可以放在主窗口容器中,这个容器控件被称为QMdiArea。

QMidArea控件通常占据在QMainWindow对象的中央位置,子窗口在这个区域是QMdiSubWindow类的实例,可以设置任何QWidget作为子窗口对象的内部控件,子窗口在MDI区域进行级联排列布局。

QMdiArea类和QMdiSubWindow类中的常用方法如下表所示:

通过示例,了解QMdiArea类和QMdiSubWindow类多文档界面的使用方法,效果如下所示:

示例中,主窗口QMainWindow拥有一个菜单控件和MidArea控件。当单击菜单控件时触发triggered信号,连接到槽函数windowaction()。当选择菜单中的“New"动作时,会添加一个新的MDI,每个MDI都有标题,在主窗口内部会增加MDI的数量。当选择菜单中的“cascade"和"Tiled"动作时,会在主窗口中显示子窗口的排列方式:级联显示子窗口或平铺显示子窗口。

实现代码如下所示:

import sys

from PyQt5.QtCore import *

from PyQt5.QtGui import *

from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):

count=0

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

self.mdi = QMdiArea()

self.setCentralWidget(self.mdi)

bar=self.menuBar()

file=bar.addMenu("File")

file.addAction("New")

file.addAction("cascade")

file.addAction("Tiled")

file.triggered[QAction].connect(self.windowaction)

self.setWindowTitle("MDI demo")

def windowaction(self, q):

print( "triggered")

if q.text()=="New":

MainWindow.count=MainWindow.count+1

sub=QMdiSubWindow()

sub.setWidget(QTextEdit())

sub.setWindowTitle("subwindow"+str(MainWindow.count))

self.mdi.addSubWindow(sub)

sub.show()

if q.text()=="cascade":

self.mdi.cascadeSubWindows()

if q.text()=="Tiled":

self.mdi.tileSubWindows()

if __name__ == '__main__':

app = QApplication(sys.argv)

demo = MainWindow()

demo.show()

sys.exit(app.exec_())

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容