调整 QDockWidget 的大小

11

我有一个包含多个QDockWidgetQMainWindow,同时只能显示一个。我的问题是:

当我隐藏一个dockWidget并显示另一个时,新显示的大小与刚刚隐藏的相同,不管我设置了什么、sizeHint或sizeConstraint!我希望新显示的部件恢复其上次的大小,但我找不到任何方法来调整 QDockWidget的大小,而不使用setMinimumSizesetMaximumSize来固定其大小。

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

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

一定有更好的方法吧?! 有什么建议吗?


3
我几年前研究过这个主题,不幸的是 QDockWidget 似乎忽略了大部分提供的布局和大小提示。最终我采用了一种复杂的方法,涉及到设置 setMinimumWidth/Height 和 setMaximumWidth/Height。 - Daniel Hedberg
3个回答

2

从文档中得知:

QDockWidget充当其子部件的包装器,使用setWidget()设置。自定义大小提示、最小和最大大小以及大小策略应该在子部件中实现。QDockWidget将尊重它们,调整自己的约束来包括边框和标题。不应在QDockWidget本身上设置大小限制,因为它们取决于它是否停靠;停靠的QDockWidget没有边框和较小的标题栏。

这意味着你不应该调整DockWidget的大小,而应该调整子部件的大小。


4
是的,我已经读了好几遍。我尝试了几个小时来通过实现sizeHint()和设置各种策略来达到正确的重设大小,但是没有达到期望的效果。除非我看到一个工作的示例,否则我不会相信文档的这部分内容。除此之外,我仍然希望DockWidges可以恢复它们上次的大小,以便不强制用户在每次更改显示的DockWidget时重新调整大小。 - Nythagoras
@Nythagoras...七年后,我仍然面临着同样的问题和绝望感 :-) - Oak_3260548

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

setGeometry似乎无法将几何形状设置为请求的QRect。程序在使用setGeometry和不使用setGeometry时表现相同。 - Nythagoras

1
我尝试了您在问题中提出的解决方案,它对我有效,尽管小部件经过额外的绘制周期时会有一个丑陋的闪光。目前我还没有找到更好的方法,所以我将使用它,直到Qt发布更好的QDockWidget支持。
我希望QDockWidget API能够增加更多的功能。这是一个很好的API,但仍然存在一些非常缺乏的领域。例如,获取选项卡式QDockWidget的索引的建议方法(来自Qt FAQ)繁琐且容易出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接