PyQt - QDock Widget


A dockable window is a subwindow that can remain in floating state or can be attached to the main window at a specified position. Main window object of QMainWindow class has an area reserved for dockable windows. This area is around the central widget.

A dock window can be moved inside the main window, or they can be undocked to be moved into a new area by the user. These properties are controlled by the following QDockWidget class methods −

Sr.No. Methods & Description
1

setWidget()

Sets any QWidget in the dock window’s area

2

setFloating()

If set to true, the dock window can float

3

setAllowedAreas()

Sets the areas to which the window can be docked

LeftDockWidgetArea
RightDockWidgetArea
TopDockWidgetArea
BottomDockWidgetArea
NoDockWidgetArea
4

setFeatures()

Sets the features of dock window

DockWidgetClosable
DockWidgetMovable
DockWidgetFloatable
DockWidgetVerticalTitleBar
NoDockWidgetFeatures

Example

In the following example, top level window is a QMainWindow object. A QTextEdit object is its central widget.

self.setCentralWidget(QTextEdit())

A dockable window is first created.

self.items = QDockWidget("Dockable", self)

A QListWidget object is added as a dock window.

self.listWidget = QListWidget()
self.listWidget.addItem("item1")
self.listWidget.addItem("item2")
self.listWidget.addItem("item3")
self.items.setWidget(self.listWidget)

Dockable object is placed towards the right side of the central widget.

self.addDockWidget(Qt.RightDockWidgetArea, self.items)

The complete code is as follows −

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class dockdemo(QMainWindow):
   def __init__(self, parent = None):
      super(dockdemo, self).__init__(parent)
		
      layout = QHBoxLayout()
      bar = self.menuBar()
      file = bar.addMenu("File")
      file.addAction("New")
      file.addAction("save")
      file.addAction("quit")
		
      self.items = QDockWidget("Dockable", self)
      self.listWidget = QListWidget()
      self.listWidget.addItem("item1")
      self.listWidget.addItem("item2")
      self.listWidget.addItem("item3")
		
      self.items.setWidget(self.listWidget)
      self.items.setFloating(False)
      self.setCentralWidget(QTextEdit())
      self.addDockWidget(Qt.RightDockWidgetArea, self.items)
      self.setLayout(layout)
      self.setWindowTitle("Dock demo")
		
def main():
   app = QApplication(sys.argv)
   ex = dockdemo()
   ex.show()
   sys.exit(app.exec_())
	
if __name__ == '__main__':
   main()

The above code produces the following output −

QDockWidget Output