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 150x75 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.dockWdg1 = QtGui.QDockWidget(mw)
mw.content1 = QtGui.QTreeWidget()
mw.addDockWidget(QtCore.Qt.DockWidgetArea(2), mw.dockWdg1)
mw.dockWdg1.setWindowTitle("1st dock widget")

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

mw.dockWdg3 = QtGui.QDockWidget(mw)
mw.content3 = QtGui.QTreeWidget()
mw.addDockWidget(QtCore.Qt.DockWidgetArea(1), mw.dockWdg3)
mw.dockWdg3.setWindowTitle("3rd dock widget")
4/17/2014 2:49:53 AM

Accepted 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()

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.

12/5/2012 3:35:47 AM

I think reimplementing the sizeHint() function based on MainWindow's size is better than just returning a fixed size.

Source Code

// size hint
QSize RenderWindow::sizeHint() const
    float width = MainWindow::instance()->width() * 0.3f;
    float height = MainWindow::instance()->height() * 0.65f;
    return QSize( width, height);

enter image description here

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow