Изменить размер 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);
}