【问题标题】:Hiding Qt widget and keeping widget space隐藏 Qt 小部件并保留小部件空间
【发布时间】:2010-12-24 20:53:00
【问题描述】:

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

【问题讨论】:

标签: qt layout widget


【解决方案1】:

在 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?

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

【讨论】:

    【解决方案2】:

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

    当你想隐藏你的小部件时,将当前的 qstackwidget 页面设置为空页面。并将其设置回您的主页以显示您的小部件。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。

      我最终添加了一个 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);
      

      填补空白。同样,您可以将垫片的大小调整为按钮的大小,并将其保持为 Fixed QSizePolicy。

      【讨论】:

        【解决方案4】:

        您可以尝试将按钮隐藏在另一个小部件中,并尝试在隐藏按钮时使另一个小部件保持其大小。这可能有点困难。建议使用 QStackedWidget,并且可能是要走的路……它类似于 QWidget 包装器,只是调整大小可能更容易。

        您可以查看的另一个选项是为占位符插入一个垫片,并将该垫片设置为按钮大小的固定大小。 (当按钮的大小发生变化时,您需要更新大小)。您应该能够成对显示/隐藏它们,并使其按预期工作。

        【讨论】:

          【解决方案5】:

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

          参见QObject::installEventFilter(QObject*)QObject::removeEventFilter(QObject*)

          【讨论】:

            【解决方案6】:

            尝试将要隐藏和取消隐藏的按钮放在另一个布局中。在该布局中与按钮一起放置一个垫片。 Call Button hide 和 spacer 将接管。Spacer 接管隐藏按钮的空间。其他按钮继续占用相同的空间。

            【讨论】:

              【解决方案7】:

              一个简单的方法是设置占位符小部件的最小尺寸而不是调整它的大小。虽然布局不考虑小部件的大小,但最小尺寸是。

              【讨论】:

                【解决方案8】:

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

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

                这应该保持可见按钮的大小相同,而不是在隐藏另一个按钮时强制它们展开。您需要注意,如果您更改按钮上的文本,您将重置它们的最大尺寸,但您可能只在一个地方执行此操作。我相信在 Qt 书籍的早期章节之一中已经完成了类似的操作(但我面前没有它,所以我无法为您指出正确的地方)。

                【讨论】:

                • 好建议,我试过这个来解决类似的问题,但我有两个按钮和一个进度条。当进度条不可见时,现在这两个按钮保持正确的大小,因为它们在对话框中“居中”。
                【解决方案9】:

                我不知道是否是最好的方法,但使用 QStackedWidget 包装按钮解决了这个问题。

                【讨论】:

                  猜你喜欢
                  • 2011-02-12
                  • 1970-01-01
                  • 2017-07-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-14
                  相关资源
                  最近更新 更多