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

у меня есть QMainWindow который содержит несколько QDockWidgets. Только один из них должен быть показан одновременно. Моя проблема заключается в следующем:

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

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

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

Должен быть лучший способ ?! Какие-либо предложения?

10

Решение

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

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

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

2

Другие решения

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

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

1

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

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);
}
1
По вопросам рекламы [email protected]