gpt4 book ai didi

c++ - 如何强制剩余的小部件占用隐藏小部件留下的额外空间?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:10 25 4
gpt4 key购买 nike

我正在开发一个 Qt 应用程序,该应用程序使用具有以下层次结构的多个小部件(如 Qt Designer 中所示):

----- 1. QMainWindow
|
|----- 2. QWidget ("central widget")
| |
| |----- 3. CustomWidget
| |
| |----- 4. QScrollBar
|
|----- 5. QStatusBar
|
|----- 6. QToolBar ("top-left toolbar")
|
|----- 7. QToolBar ("top-right toolbar")

它们是这样排列的:

(1) ------------------------------
| (6) | (7) |
|----------------------------|
| (3) | (4) |
| | |
| | |
| | |
------------------------------
| (5) |
------------------------------

(请注意,中央小部件已被有意省略,因为它没有显示为明显不同的组件。)

设置文件决定 QStatusBar 是否应该显示调试信息。如果不应该,则应该隐藏 QStatusBar。 QStatusBar 默认不隐藏;只有在读取设置文件后才会隐藏它。为此,我使用了 QWidget::hide() 方法。

果然,QStatusBar 被隐藏了。但是,其余的小部件(特别是 CustomWidget 和 QScrollBar)不会扩展以填充(现在隐藏的)QStatusBar 留下的空间。

我找到了 QWidget::update()QWidget::repaint() 方法,但它们在这里似乎用处不大。 (我已经尝试在 QStatusBar 小部件以及 QMainWindow、中央小部件、QScrollBar 和 CustomWidget 上使用它们,但都无济于事。)

我已经阅读了 size policy 上的 Qt 页面这似乎很有希望。我正在使用以下大小策略设置:

  • QMainWindow:“首选”(水平和垂直)
  • 中央小部件:“扩展”(水平和垂直)
  • QToolBars:“首选”(水平)、“固定”(垂直)
  • QStatusBar:“首选”(水平和垂直)
  • CustomWidget:“扩展”(水平和垂直)
  • QScrollBar:“固定”(水平),“扩展”(垂直)

这个想法是中央小部件应该填满两个 QToolBar 和 QStatusBar 没有占用的空间。然后 CustomWidget 应该填满中央小部件中未被(垂直)QScrollBar 使用的所有空间。然而,这些大小策略似乎完全被忽视了——QStatusBar 消失了,但其他小部件没有填满空间。

我怀疑答案可能在 layout management in Qt 中, 但在 Qt Designer 中玩过这个(看起来它为每个小部件应用了各种布局类)我找不到使它工作的安排。

我需要做些什么才能让 CustomWidget 和 QScrollBar 利用隐藏 QStatusBar 时留下的空间?

编辑

与此同时,我通过将 QMainWindow 的大小调整一个像素然后再调整回来,实现了一个拼凑。调整大小事件似乎以我喜欢的方式重排小部件。这是一个不优雅的解决方案,必须有一种方法可以正确地做到这一点!

最佳答案

在仔细阅读 code for QMainWindowLayout 之后,特别是 sizeHint,这似乎是在私有(private)类中实现的正常行为。基本上,当隐藏或显示状态栏时,无需更改其他内容

要改变它,像这样覆盖 QMainWindow::sizeHint:

QSize MyMainWindow::sizeHint() const
{
QSize hint = QMainWindow::sizeHint();
// if the status bar is invisible, add its height to the return value
if (statusBar() && !statusBar()->isVisible())
hint.rheight() += statusBar().sizeHint().height();
return hint;
}

编辑
这是我能想到的最简单的解决方案。如果它不起作用,下一步将涉及重新实现 resizeEvent 并检查它是否是状态栏隐藏的结果。

关于c++ - 如何强制剩余的小部件占用隐藏小部件留下的额外空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com