[PyQt] QDockWidget sizing behavior

John Wiggins jwiggins at enthought.com
Mon Oct 11 21:00:50 BST 2010


On Mon, Oct 11, 2010 at 2:21 PM, Hans-Peter Jansen <hpj at urpla.net> wrote:

> On Monday 11 October 2010, 17:58:35 John Wiggins wrote:
> > On Mon, Oct 11, 2010 at 10:33 AM, Hans-Peter Jansen <hpj at urpla.net>
> wrote:
> > > On Monday 11 October 2010, 16:17:21 John Wiggins wrote:
> > > > Hello,
> > > >
> > > > I'm laying out part of the UI for my app using a QMainWindow with
> > > > no central widget and 4 dock widgets. I'd like the dock widgets
> > > > to be sized proportionally to each other but they seem to ignore
> > > > the value returned by sizeHint(). Am I missing something?
>
> You could try to subclass the QLabels and implement sizeHint for them,
> leaving _ViewContainer alone (size wise).. Let us know, if that helps.
>
> Since you have QMainWindows in each of your dock widgets, the outcome is
> still hard to predict. You may want to reduce your example to the bare
> minimum, e.g. with a single QMainWindow, if the above does not appear
> to work.
>
> Pete
>

It's still not working. Here's my QLabel:

class _Label(QtGui.QLabel):
    def __init__(self, name, size, main_window):
        QtGui.QLabel.__init__(self, name)

        # Save the size and main window.
        self._width, self._height = size
        self._main_window = main_window
        # set a minimum size to quiet Qt
        self.setMinimumSize(100, 100)
        self.setSizePolicy(QtGui.QSizePolicy.Preferred,
QtGui.QSizePolicy.Preferred)

    def sizeHint(self):
        sh = QtCore.QSize(100, 100)

        if self._width > 0:
            if self._width > 1:
                w = self._width
            else:
                w = self._main_window.width() * self._width
            sh.setWidth(int(w))
        if self._height > 0:
            if self._height > 1:
                h = self._height
            else:
                h = self._main_window.height() * self._height
            sh.setHeight(int(h))
        return sh

And since that didn't change the behavior at all, I took the extra
QMainWindow instances out of the picture by modifying the createDockWidget()
method in MainWindow:


def createDockWidget(self, name, size):
        dock = QtGui.QDockWidget(name, self)
        child = _Label(name, size, self)
        dock.setWidget(child)

        dock.setObjectName(name)
        self._qt4_adjust_widget_layout(child)
        return dock

That still has no effect on the original behavior. sizeHint() is called on
the _Label instances and ignored.

- John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20101011/37204878/attachment-0001.html>


More information about the PyQt mailing list