Изменить размер QDockWidget

У меня есть QMainWindow, который содержит несколько QDockWidget s. Одновременно следует показывать только один из них. Моя проблема:

Когда я скрою dockWidget и покажу другой, размер только что показанного будет таким же, как только скрытый, независимо от того, какой QSizePolicys, sizeHint, sizeConstraint я установил! Я хочу, чтобы вновь показанный восстанавливал свой последний размер, но я не могу найти какой-либо метод для изменения размера QDockWidget, не исправляя его размер с помощью setMinimumSize и setMaximumSize.

На самом деле есть один способ, но я считаю его очень уродливым:

setMinimumWidth(500);
setMaximumWidth(500);
qApp().processEvents();
setMinimumWidth(0);
setMaximumWidth(9999);

Должен быть лучший способ?! Любые предложения?

Ответ 1

Из документации:

QDockWidget выступает в качестве оболочки для дочернего виджета, заданного с помощью setWidget(). В дочернем виджете должны быть реализованы подсказки по размеру, минимальные и максимальные размеры и размер. QDockWidget будет уважать их, корректируя свои собственные ограничения, чтобы включить фрейм и заголовок. Ограничения размера не должны устанавливаться в самом QDockWidget, потому что они изменяются в зависимости от того, будет ли он состыкован; пристыкованный QDockWidget не имеет фрейма и меньшей строки заголовка.

Это означает, что вместо изменения размера DockWidget вы должны изменить размер дочернего виджета.

Ответ 2

Я попробовал решение, которое вы предложили в своем вопросе, и оно работает для меня, хотя есть уродливая вспышка, в то время как виджет проходит дополнительный цикл рисования. Я не нашел лучшего способа, поэтому буду использовать его до тех пор, пока Qt не улучшит поддержку QDockWidget.

Я надеюсь, что в QDockWidget API добавится больше функциональных возможностей. Это отличный API, но есть несколько областей, которые по-прежнему крайне отсутствуют. Например, этот предложенный метод получения индекса с вкладкой QDockWidget (прямо из Qt FAQ) является громоздким и подверженным ошибкам.

Ответ 3

Я предлагаю перегрузить

protected :
virtual bool    event ( QEvent * event );

и поймать событие, которое изменит ваш размер

например:

QRect mGeo;
bool    MyDockWidget::event ( QEvent * aEvent )
{
    if(aEvent->isAccepted ())
    {
        if(aEvent->type()==QEvent::Hide)
        {
            mGeo=this->geometry();
        }
        if(aEvent->type()==QEvent::Show)
        {
            this->setGeometry(mGeo);
        }
    }
    return QDockWidget::event(aEvent);
}