我有QMainWindow
,其中包含多个QDockWidget
个。一次只能显示其中一个。我的问题是:
当我隐藏dockWidget并显示另一个时,无论我设置了什么QSizePolicys,sizeHint,sizeConstraint,新显示的大小都与刚隐藏的大小相同!我希望新显示的内容可以恢复自己的最后一个尺寸,但我找不到任何方法来调整QDockWidget
的大小,而不会使用setMinimumSize
和setMaximumSize
修改其大小。
事实上有一种方法,但我认为它非常难看:
setMinimumWidth(500);
setMaximumWidth(500);
qApp().processEvents();
setMinimumWidth(0);
setMaximumWidth(9999);
必须有更好的方法吗?!有什么建议吗?
答案 0 :(得分:2)
来自文档:
QDockWidget充当其子窗口小部件的包装器,使用setWidget()设置。应在子窗口小部件中实现自定义大小提示,最小和最大大小和大小策略。 QDockWidget将尊重它们,调整自己的约束以包含框架和标题。不应在QDockWidget本身上设置大小约束,因为它们会根据是否停靠而改变;停靠的QDockWidget没有框架和较小的标题栏。
这意味着您应该调整子窗口小部件的大小,而不是调整DockWidget的大小。
答案 1 :(得分:1)
我尝试了你在问题中建议的解决方案,它对我有用,虽然当小部件经历额外的绘制周期时会有一个丑陋的闪光。我还没有找到更好的方法,因此我将暂时使用它,直到Qt发布更好的QDockWidget支持。
我希望QDockWidget API能够添加更多功能。这是一个很棒的API,但有几个领域仍然非常缺乏。例如,this suggested method获取标签式QDockWidget的索引(直接来自Qt FAQ)是麻烦且容易出错的。
答案 2 :(得分: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);
}