您的位置:首页 > 编程语言 > Qt开发

PyQt4 精彩实例分析* 实例13 多文档

2013-09-18 16:27 323 查看
在使用QMainWindow作为主窗口时,经常会用到多文档的方式对文件进行显示,本实例通过一个简单的例子分析如何实现多文档的布局方式。实例效果图如下。



Qt提供了一个QWorkspace类,利用QWorkspace类可以很方便地实现多文档的应用。QWorkspace类继承自QWidget类,因此只需在QMainWindow主窗口中把QWorkspace对象设置为中央窗体即可。QWorkspace类提供了许多对子窗口进行排序的函数接口,如cascade(),arrangeIcon(),title()等。

实现代码如下:

# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))

class MainWidget(QMainWindow):
def __init__(self,parent=None):
super(MainWidget,self).__init__(parent)
self.setWindowTitle(self.tr("多文档窗口"))
self.workSpace=QWorkspace()
self.setCentralWidget(self.workSpace)

window1=QMainWindow()
window1.setWindowTitle(self.tr("窗口1"))
edit1=QTextEdit(self.tr("子窗口1"))
window1.setCentralWidget(edit1)
window2=QMainWindow()
window2.setWindowTitle(self.tr("窗口2"))
edit2=QTextEdit(self.tr("子窗口2"))
window2.setCentralWidget(edit2)
window3=QMainWindow()
window3.setWindowTitle(self.tr("窗口3"))
edit3=QTextEdit(self.tr("子窗口3"))
window3.setCentralWidget(edit3)

self.workSpace.addWindow(window1)
self.workSpace.addWindow(window2)
self.workSpace.addWindow(window3)

self.createMenu()
self.slotScroll()

def createMenu(self):
layoutMenu=self.menuBar().addMenu(self.tr("布局"))
arrange=QAction(self.tr("排列图标"),self)
self.connect(arrange,SIGNAL("triggered()"),self.workSpace,SLOT("arrangeIcons()"))
layoutMenu.addAction(arrange)

tile=QAction(self.tr("平铺"),self)
self.connect(tile,SIGNAL("triggered()"),self.workSpace,SLOT("tile()"))
layoutMenu.addAction(tile)

cascade=QAction(self.tr("层叠"),self)
self.connect(cascade,SIGNAL("triggered()"),self.workSpace,SLOT("cascade()"))
layoutMenu.addAction(cascade)

otherMenu=self.menuBar().addMenu(self.tr("其它"))
scrollAct=QAction(self.tr("滚动"),self)
self.connect(scrollAct,SIGNAL("triggered()"),self.slotScroll)
otherMenu.addAction(scrollAct)
otherMenu.addSeparator()

nextAct=QAction(self.tr("下一个"),self)
self.connect(nextAct,SIGNAL("triggered()"),self.workSpace,SLOT("activateNextWindow()"))
otherMenu.addAction(nextAct)

previousAct=QAction(self.tr("上一个"),self)
self.connect(previousAct,SIGNAL("triggered()"),self.workSpace,SLOT("activatePreviousWindow()"))
otherMenu.addAction(previousAct)

def slotScroll(self):
self.workSpace.setScrollBarsEnabled(not self.workSpace.scrollBarsEnabled())

app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()


slotScroll()槽函数完成对多文档空间QWorkspace的滑动条进行设置。

第12行创建了一个QWorkspace对象。

第13行设置主窗口的中央窗体为QWorkspace对象,以使主窗口能实现多文档的布局方式。

createMenu()函数创建主窗口的菜单栏

第15-26行新建三个子窗口用于在主窗口中显示。

第28-30行在workSpace中插入这些子窗口,即实现了多文档的显示。

第37-39行实现对子窗口的arrangeIcons布局,它的布局方式是将所有子窗口以标题栏的方式在主窗口的底部进行排列,如下图所示。可直接把菜单的triggered()信号与QWorkspace对象的arrangeIcons()方法相连。



注意此排列方式,仅对已经最小化的子窗口起作用。

第41-43行实现子窗口的tile布局,tile的意思是用子窗口把主窗口像铺瓦片或贴瓷砖一样排满,如下图所示,可直接连接QWorkspace对象的tile()函数实现。



第45-47行实现对子窗口的cascade布局,即子窗口的层叠显示,如下图所示,可直接连接QWorkspace对象的cascade()函数实现。



第55-57行使下一个子窗口获得焦点,成为当前应用子窗口,直接把菜单项与QWorkspace对象的activateNextWindow()函数连接实现。

第59-61行使前一个子窗口获得焦点,成为当前应用子窗口,直接把菜单项与QWorkspace对象的activatePreviousWindow()函数连接实现。

子窗口的顺序由QWorkspace的WindowOrder属性决定,有以下两种可能的顺序。

QWorkspace.CreationOrder:子窗口创建的先后顺序。

QWorkspace.StackingOrder:子窗口堆栈的顺序,即处于最上方的子窗口是最后一个子窗口。

其中,CreationOrder是默认的子窗口顺序。

当调用windowList()函数获得主窗口的所有子窗口列表时,以WindowOrder作为参数,返回的子窗口列表即以指明的顺序进行排列。

第64行通过QWorkspace的setScrollBarsEnabled()函数,可对workSpace滑动条的可用性进行设置。

 

 

 

注:本文基本上是经过改编的《Linux窗口程序设计--Qt4精彩实例分析》一书的PyQt4 for windows版本

转自:http://blog.csdn.net/chumpklutz/article/details/6073828
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: