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_()
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
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.