How to set QDockWidget initial (default) size in the app with no central widget (PyQt4)?

I have an app with a lot of QDockWidgets and without central widget. I want to set some of those QDockWidgets initial size (size at application’s start), but I don’t want to limit their min/max sizes.

How to do it? For example, I need to set initial size 150×75 to one of them. I tried obvious methods (such as QWidget.Resize() relating to dock widget content), but it didn’t work at all.

Here is a simplified model of situation:

from PyQt4 import QtCore, QtGui

app = QtGui.QApplication([''])

mw = QtGui.QMainWindow() # mw = MainWindow
mw.setCentralWidget(None)
mw.showMaximized()

mw.dockWdg1 = QtGui.QDockWidget(mw)
mw.content1 = QtGui.QTreeWidget()
mw.dockWdg1.setWidget(mw.content1)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(2), mw.dockWdg1)
mw.dockWdg1.setWindowTitle("1st dock widget")

mw.dockWdg2 = QtGui.QDockWidget(mw)
mw.content2 = QtGui.QTreeWidget()
mw.dockWdg2.setWidget(mw.content2)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(1), mw.dockWdg2)
mw.dockWdg2.setWindowTitle("2nd dock widget")

mw.dockWdg3 = QtGui.QDockWidget(mw)
mw.content3 = QtGui.QTreeWidget()
mw.dockWdg3.setWidget(mw.content3)
mw.addDockWidget(QtCore.Qt.DockWidgetArea(1), mw.dockWdg3)
mw.dockWdg3.setWindowTitle("3rd dock widget")

mw.show()
app.exec_()

Best answer

The dockwidgets will be incorporated into the layout of the main window, so any attempt to resize them will be ignored.

The standard workaround for this is to create a subclass of the content widget and reimplement its sizeHint:

class TreeWidget(QtGui.QTreeWidget):
    def sizeHint(self):
        return QtCore.QSize(150, 75)

mw.dockWdg2 = QtGui.QDockWidget(mw)
mw.content2 = TreeWidget()
mw.dockWdg2.setWidget(mw.content2)

However, this will only work to the extent that you also carefully manage the sizes of the other dockwidgets. And of course maximiizing the main window is also going to have a impact on the final outcome.

You might also want to consider using QMainWindow.saveState and QMainWindow.restoreState to manage the initial state of your dockwidgets.