Simply save the code below and import it into your project. You can add it to your main window by:
and voila! your dockable widgets auto-hide.
- from PySide.QtGui import *
- """
- QMainWindow "mixin" which provides auto-hiding support for dock widgets
- (not toolbars).
- """
- DOCK_AREA_TO_TB = {
- }
- def __init__(self, area, parent, name="AUTO_HIDE"):
- assert area in self.DOCK_AREA_TO_TB
- self._area = area
- self.setObjectName(name)
- self.setWindowTitle(name)
- self.setFloatable(False)
- self.setMovable(False)
- w.resize(10, 100)
- self.addWidget(w)
- self.setAllowedAreas(self.DOCK_AREA_TO_TB[self._area])
- self.parent().addToolBar(self.DOCK_AREA_TO_TB[self._area], self)
- self.parent().centralWidget().installEventFilter(self)
- self.setVisible(False)
- self.hideDockWidgets()
- def _dockWidgets(self):
- mw = self.parent()
- if mw.dockWidgetArea(w) == self._area and not w.isFloating():
- yield w
- def paintEvent(self, event):
- def _multiSetVisible(self, widgets, state):
- if state:
- self.setVisible(False)
- for w in widgets:
- w.setUpdatesEnabled(False)
- for w in widgets:
- w.setVisible(state)
- for w in widgets:
- w.setUpdatesEnabled(True)
- if not state and widgets:
- self.setVisible(True)
- def enterEvent(self, event):
- self.showDockWidgets()
- def eventFilter(self, obj, event):
- assert obj == self.parent().centralWidget()
- self.hideDockWidgets()
- return False
- def setDockWidgetsVisible(self, state):
- self._multiSetVisible(list(self._dockWidgets()), state)
- def showDockWidgets(self): self.setDockWidgetsVisible(True)
- def hideDockWidgets(self): self.setDockWidgetsVisible(False)

