у меня есть QMainWindow
который содержит несколько QDockWidget
s. Только один из них должен быть показан одновременно. Моя проблема заключается в следующем:
Когда я скрываю dockWidget и показываю другой, размер вновь показанного изображения совпадает с только что скрытым, независимо от того, какой QSizePolicys, sizeHint, sizeConstraint я установил! Я хочу, чтобы вновь показанный объект восстановил свой последний размер, но не могу найти какой-либо метод для изменения размера QDockWidget
без фиксации его размера с setMinimumSize
а также setMaximumSize
,
На самом деле есть один способ, но я считаю его очень уродливым:
setMinimumWidth(500);
setMaximumWidth(500);
qApp().processEvents();
setMinimumWidth(0);
setMaximumWidth(9999);
Должен быть лучший способ ?! Какие-либо предложения?
Из документации:
QDockWidget действует как оболочка для своего дочернего виджета, установленного с помощью setWidget (). Настраиваемые подсказки размеров, минимальные и максимальные размеры и политики размеров должны быть реализованы в дочернем виджете. QDockWidget будет уважать их, корректируя свои собственные ограничения, чтобы включить фрейм и заголовок. Ограничения размера не должны быть установлены на самом QDockWidget, потому что они изменяются в зависимости от того, закреплен ли он; закрепленный QDockWidget не имеет рамки и меньшей строки заголовка.
Это означает, что вместо изменения размера DockWidget вы должны изменить размер дочернего виджета.
Я попробовал решение, которое вы предложили в своем вопросе, и оно работает для меня, хотя есть ужасная вспышка, когда виджет проходит дополнительный цикл рисования. Я не нашел лучшего способа, поэтому пока буду использовать его, пока Qt не выпустит лучшую поддержку QDockWidget.
Я надеюсь, что в API QDockWidget будет добавлено больше функциональных возможностей. Это отличный API, но есть несколько областей, которых до сих пор не хватает. Например, этот предложенный метод получение индекса вкладки QDockWidget (прямо из Qt FAQ) является громоздким и подверженным ошибкам.
Предлагаю перегрузить
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);
}