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

时间:2016-06-24 14:15:56

标签: c++ qt user-interface

我正在开发一个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:'固定'(水平),'扩展'(垂直)

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

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

当隐藏QStatusBar时,我需要做些什么来使CustomWidget和QScrollBar利用剩下的空间?

修改

我通过将QMainWindow调整一个像素并再次调整,实现了平均时间内的kludge。 resize事件似乎以我想要的方式重排小部件。这是一个不优雅的解决方案,必须有办法正确地做到这一点!

1 个答案:

答案 0 :(得分:0)

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

要更改此设置,请覆盖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并检查它是否是状态栏隐藏的结果。