调整QDockWidget的大小

时间:2013-01-08 13:21:34

标签: c++ qt user-interface qdockwidget

我有QMainWindow,其中包含多个QDockWidget个。一次只能显示其中一个。我的问题是:

当我隐藏dockWidget并显示另一个时,无论我设置了什么QSizePolicys,sizeHint,sizeConstraint,新显示的大小都与刚隐藏的大小相同!我希望新显示的内容可以恢复自己的最后一个尺寸,但我找不到任何方法来调整QDockWidget的大小,而不会使用setMinimumSizesetMaximumSize修改其大小。

事实上有一种方法,但我认为它非常难看:

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

必须有更好的方法吗?!有什么建议吗?

3 个答案:

答案 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);
}