隐藏Qt小部件并保持小部件空间

时间:2009-12-09 14:57:25

标签: qt layout widget

我以一个简单的形式制作了几个按钮并放置了水平布局。当鼠标离开该区域时,应该隐藏其中一个按钮,最后一个按钮。使用button-> hide()它可以工作,但所有按钮都由布局管理器重新排列。我想要的是所有其他按钮继续在他们的位置。我尝试用小部件占位符替换小部件并交换按钮和占位符hide()/ show(),调用占位符 - >调整大小(button-> size()),但布局管理器不尊重调整大小占位符设置为最小大小。删除小部件并保留其空间的最佳方法是什么?

9 个答案:

答案 0 :(得分:17)

在Qt 5.2中,可以执行以下操作:

QSizePolicy sp_retain = widget->sizePolicy();
sp_retain.setRetainSizeWhenHidden(true);
widget->setSizePolicy(sp_retain);

我之前在这里发布了相同的解决方案:

How to make a Qt widget invisible without changing the position of the other Qt widgets?

(这似乎是这个问题的重复)。

答案 1 :(得分:6)

尝试将您的窗口小部件嵌入到具有2个页面的QStackWidget中: *您的小部件在一个页面上 *另一个空页

如果要隐藏窗口小部件,请将当前qstackwidget页面设置为空白页面。并将其设置回主页面以显示您的小部件。

答案 2 :(得分:2)

我遇到了同样的问题。

我最终添加了一个Horizo​​ntalSpacer(我的布局是水平的),我最初设置为0大小和固定大小的策略。然后我用了:

if (button_is_shown)
  ui.horizontalSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed);
else
  ui.horizontalSpacer->changeSize(1,1, QSizePolicy::Expanding, QSizePolicy::Fixed);

填补空间。同样,您可以将间隔尺寸调整为按钮的大小,并将其保持为固定QSizePolicy。

答案 3 :(得分:0)

您可以尝试将按钮隐藏在另一个窗口小部件中,并尝试在隐藏按钮时使其他窗口小部件正确保持其大小。这可能有点困难。已经提出了一个QStackedWidget,可能就是这样......它类似于QWidget包装器,除了大小调整可能更容易。

您可以看到的另一个选项是为占位符插入间隔符,并将间隔符设置为固定大小,即按钮的大小。 (当按钮的大小改变时,您需要更新大小)。你应该能够成对显示/隐藏它们并使它像你期望的那样工作。

答案 4 :(得分:0)

我还会尝试安装一个覆盖原始绘制事件的事件过滤器,绘制透明背景,并忽略窗口小部件在不可见时不应响应的大多数事件(可能是所有事件,除了{{1} })。当窗口小部件再次可见时,请删除事件过滤器。

请参阅QObject::installEventFilter(QObject*)QObject::removeEventFilter(QObject*)

答案 5 :(得分:0)

尝试将要隐藏的按钮放在另一个布局中,然后取消隐藏。在那个布局中随着按钮放一个垫片。呼叫按钮隐藏和间隔将接管.Spacer接管隐藏按钮的空间。其他按钮继续占据相同的空间。

答案 6 :(得分:0)

一种简单的方法是设置占位符小部件的最小大小,而不是调整大小。虽然布局不遵守窗口小部件的大小,但最小尺寸为。

答案 7 :(得分:0)

最简单的方法可能是将按钮的最大尺寸设置为它们的尺寸提示。

button->setMaximumSize(button->sizeHint());

这应该使可见按钮保持相同的大小,并且在隐藏另一个按钮时不强制它们展开。您需要注意的是,如果更改按钮上的文本,则重置其最大尺寸,但您可能只在一个地方执行此操作。我相信这样的事情是在Qt书的前几章中完成的(但是我没有把它放在我面前,所以我不能把你指向正确的地方)。

答案 8 :(得分:-1)

我不知道是否是最好的方法,但是使用QStackedWidget来解决这个问题。