我有一个包含几个QDockWidget
的QMainWindow
。一次只能展示其中一个。我的问题是
当我隐藏一个dockWidget并显示另一个dockWidget时,新显示的大小与刚刚隐藏的大小相同,无论我设置了什么qsizepolicies, sizeHint, sizeconstrconstraint !我希望新显示的恢复自己的最后大小,但我找不到任何方法来调整QDockWidget
的大小,而不使用setMinimumSize
和setMaximumSize
固定其大小。
实际上有一种方法,但我认为它很难看:
setMinimumWidth(500);
setMaximumWidth(500);
qApp().processEvents();
setMinimumWidth(0);
setMaximumWidth(9999);
一定有更好的办法?!有什么建议吗?
来自文档:
QDockWidget充当其子部件的包装器,使用setWidget()进行设置。自定义大小提示、最小和最大大小以及大小策略应该在子小部件中实现。QDockWidget将尊重它们,调整自己的约束以包含框架和标题。大小限制不应该设置在QDockWidget本身,因为他们改变取决于它是否停靠;一个停靠的QDockWidget没有框架和更小的标题栏。
这意味着您不应该调整DockWidget的大小,而应该调整子部件的大小。
我尝试了你在你的问题中建议的解决方案,它适用于我,虽然有一个丑陋的闪光,而小部件经过一个额外的油漆周期。我还没有找到一个更好的方法,所以我现在将使用它,直到Qt发布更好的支持QDockWidget。
我希望会有更多的功能添加到QDockWidget API。它是一个很棒的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);
}