调整QDockWidget的大小

resize a QDockWidget

本文关键字:QDockWidget 调整      更新时间:2023-10-16

我有一个包含几个QDockWidgetQMainWindow。一次只能展示其中一个。我的问题是

当我隐藏一个dockWidget并显示另一个dockWidget时,新显示的大小与刚刚隐藏的大小相同,无论我设置了什么qsizepolicies, sizeHint, sizeconstrconstraint !我希望新显示的恢复自己的最后大小,但我找不到任何方法来调整QDockWidget的大小,而不使用setMinimumSizesetMaximumSize固定其大小。

实际上有一种方法,但我认为它很难看:

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