We'll make a little viewmanager class will arrange the views separated by splitter bars. That class will be based on the QSplitter class. I would advise you never to use a splitter to separate documents (in contrast to BlackAdder, which does use this paradigm) — it's so uncommon that people will get confused. Building the class is a useful little introduction to QSplitter, though. A splitter is best used if you have a list of items or icons on the left, and a document pane to the right. Indeed, you might want to use one of the other arrangements for showing more than one window in the document pane, and separate the workspace from a selection list using a QSplitter. If you do this, the selection list functions as a kind of always-visible windows menu.
""" splitspace.py - splitter 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 SplitSpace(QSplitter): def __init__(self, *args): apply(QSplitter.__init__,(self, ) + args) self.views=[] def addView(self, view): self.views.append(view)
Clever and clean as Qt might be, it is not immune to the inevitable inconsistencies caused by prolonged development. Some classes, such as the QTabWidget we saw above, have special insert or add methods for the insertion or addition of child widgets; others, like QWorkspace take care of their children if those children are created with them as the parent. This also holds for QSplitter — create a widget with a QSplitter object as a parent, and it will be automatically managed by the splitter. Therefore the addView() function has little to do.
def removeView(self, view): pass def activeWindow(self): for view in self.views: if view.hasFocus(): return view return self.views[0]
In order to be able to figure out which of the widgets managed by the splitter is the currently active one, we have to loop over the list and retrieve the one with focus. If that fails, we fall back on a hack: just return the first one.
def cascade(self): pass def tile(self): pass def canCascade(self): return FALSE def canTile(self): return FALSE
Obviously, cascading nor tiling is relevant for this class.