我正在开发一个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页面,这似乎很有希望。我正在使用以下大小政策设置:
这个想法是中央小部件应该填满两个QToolBars和QStatusBar没有占用的空间。然后,CustomWidget应填充(垂直)QScrollBar未使用的中央窗口小部件中的所有空间。但是,这些大小的策略似乎完全被忽视 - QStatusBar消失但其他小部件没有填满空间。
我怀疑答案可能在layout management in Qt,但是在Qt Designer中使用它(看起来它应用了每个小部件的各种布局类)我找不到使这个工作的安排。 / p>
当隐藏QStatusBar时,我需要做些什么来使CustomWidget和QScrollBar利用剩下的空间?
我通过将QMainWindow调整一个像素并再次调整,实现了平均时间内的kludge。 resize事件似乎以我想要的方式重排小部件。这是一个不优雅的解决方案,必须有办法正确地做到这一点!
答案 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
并检查它是否是状态栏隐藏的结果。