A stack of documents
I said I wouldn't do an emacs-like stack
of documents without any surrounding GUI — but it was so
easy. PyQt contains a very basic class,
QWidgetStack, which can contain any
number of widgets, though only one is shown at a time. This
class is used in QWizard,
QTabWidget and
QTabDialog, but it can be very useful
when used by itself, too.
"""
stackspace.py - stacked view manager for the mdi framework
copyright: (C) 2001, Boudewijn Rempt
email: boud@rempt.xs4all.nl
"""
from qt import *
from resources import TRUE, FALSE
class StackSpace(QWidgetStack):
def __init__(self, *args):
apply(QWidgetStack.__init__,(self, ) + args)
self.views=[]
def addView(self, view):
self.views.append(view)
self.addWidget(view, len(self.views) - 1)
self.raiseWidget(view)
def removeView(self, view):
if view in self.views:
self.views.remove(view)
self.removeWidget(view)
QWidgetStack is one
of those classes that wants its children to be explicitly added
and removed. You also have to give a numerical ID to identify
the widget.
def activeWindow(self):
return self.visibleWidget()
def cascade(self): pass
def tile(self): pass
def canCascade(self):
return FALSE
def canTile(self):
return FALSE
def windowList(self):
return self.views
def activateView(self, view):
self.raiseWidget(view)
In contrast with all other view managers
we have created up to now, QWidgetStack
does not automatically raise a window when it gets focus. This
means that we have to add a new method to the view manager
interface— activateView. This has to
be added to all other view managers, too, and there is a small
change necessary in the application class
MDIApp:
def slotWindowMenuActivated(self, index):
self.menuToWindowMap[index].setFocus()
becomes:
def slotWindowMenuActivated(self, index):
self.workspace.activateView(self.menuToWindowMap[index])
Of course, this is merely an example of
the use of QWidgetStack. If you want to
present your users with stacked document windows, you ought to
offer more than a mere ‘window' menu for selecting
windows— A keyboard interface, for instance, or perhaps a
listview with icons for open documents to the left.