在使用 QMainWindow 作为主窗口时, 经常会用到多文档的方式对文件进行显示, 本例通过一个简单的例子分析如何实现多文档的布局方式。例效果图如下
Qt 提供了一个 QWorkspace 类,利用 QWorkspace 类可以很方便地实现多文档的应用。QWorkspace 类继承自 QWidget 类,因此只需在 QMainWindow 主窗口中把 QWorkspace 对象设置为中央窗体即可。QWorkspace 类提供了许多对子窗口进行排序的函数接口,如 cascade(),arrangeIcon(),title()等。
代码:
1 #coding: utf-8 2 from PyQt4.QtCore import * 3 from PyQt4.QtGui import * 4 import sys 5 6 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 7 8 class MainWidget(QMainWindow): 9 def __init__(self, parent=None): 10 super(MainWidget, self).__init__(parent) 11 self.setWindowTitle(self.tr("多文档窗口")) 12 self.workSpace = QWorkspace() 13 #设置主窗口的中央窗体为 QWorkspace 对象,以使主窗口能实现多文档的布局方式 14 self.setCentralWidget(self.workSpace) 15 16 window1 = QMainWindow() 17 window1.setWindowTitle(self.tr("窗口1")) 18 edit1 = QTextEdit(self.tr("子窗口1")) 19 window1.setCentralWidget(edit1) 20 window2 = QMainWindow() 21 window2.setWindowTitle(self.tr("窗口2")) 22 edit2 = QTextEdit(self.tr("子窗口2")) 23 window2.setCentralWidget(edit2) 24 window3 = QMainWindow() 25 window3.setWindowTitle(self.tr("窗口3")) 26 edit3 = QTextEdit(self.tr("子窗口3")) 27 window3.setCentralWidget(edit3) 28 29 self.workSpace.addWindow(window1) 30 self.workSpace.addWindow(window2) 31 self.workSpace.addWindow(window3) 32 #createMenu()函数创建主窗口的菜单栏 33 self.createMenu() 34 self.slotScroll() 35 36 def createMenu(self): 37 layoutMenu = self.menuBar().addMenu(self.tr("布局")) 38 #现对子窗口的 arrangeIcons 布局,它的布局方式是将所有子窗口以标题栏的方式在主窗口的底部进行排列, 39 # 如下图所示。可直接把菜单的 triggered()信号与QWorkspace 对象的 arrangeIcons()方法相连。 40 #注意此排列方式,仅对已经最小化的子窗口起作用。 41 arrange = QAction(self.tr("排列图标"), self) 42 self.connect(arrange, SIGNAL("triggered()"),self.workSpace,SLOT("arrangelcons()")) 43 layoutMenu.addAction(arrange) 44 #实现子窗口的 tile 布局,tile 的意思是用子窗口把主窗口像铺瓦片或贴瓷砖一样排满,如下图所示, 45 # 可直接连接 QWorkspace 对象的 tile()函数实现 46 tile = QAction(self.tr("平铺"), self) 47 self.connect(tile, SIGNAL("triggered()"), self.workSpace, SLOT("tile()")) 48 layoutMenu.addAction(tile) 49 50 cascade = QAction(self.tr("层叠"), self) 51 self.connect(cascade, SIGNAL("triggered()"), self.workSpace, SLOT("casxade()")) 52 layoutMenu.addAction(cascade) 53 54 otherMenu = self.menuBar().addMenu(self.tr("其它")) 55 scrollAct = QAction(self.tr("滚动"), self) 56 self.connect(scrollAct, SIGNAL("triggered()"), self.slotScroll) 57 otherMenu.addAction(scrollAct) 58 otherMenu.addSeparator() 59 60 nextAct = QAction(self.tr("下一个"), self) 61 self.connect(nextAct, SIGNAL("triggered()"), self.workSpace, SLOT("activateNextWindow()")) 62 otherMenu.addAction(nextAct) 63 64 previoustAct = QAction(self.tr("上一个"), self) 65 self.connect(previoustAct, SIGNAL("triggered()"), self.workSpace, SLOT("activatePreviousWindow()")) 66 otherMenu.addAction(previoustAct) 67 #slotScroll()槽函数完成对多文档空间 QWorkspace 的滑动条进行设置 68 def slotScroll(self): 69 self.workSpace.setScrollBarsEnabled(not self.workSpace.scrollBarsEnabled()) 70 71 app = QApplication(sys.argv) 72 main = MainWidget() 73 main.show() 74 app.exec_()