如何通过编程将QMainWindow调整为其最小大小

5
当我使用网格布局的QMainWindow并用鼠标调整大小时,它不会缩小到一定的最小尺寸,以使其中的所有控件都能正确显示。在我的应用程序中,有时我会编程隐藏控件,但是窗口的大小仍然保持不变,其他控件看起来分散开,它们之间的空间太大了。最终我手动调整对话框的大小,以避免它看起来很丑。
在我隐藏控件后,我可以通过编程方式将对话框的垂直大小设置为手动调整大小时获得的这个最小值吗?

1
+1 我也感到沮丧。 - Joseph Quinsey
刚刚想通了,见下面我的回答。 - sashoalm
3个回答

2
我发现调整QMainWindow中的centralWidget大小,然后再调整QMainWindow本身的大小就可以解决问题。换句话说:
from PyQt4 import QtGui
class MyMainWindow(QtGui.QMainWindow):
    def __init__(self):
        # define some widgets and stuff
    def whenWidgetsAreHidden(self):
        # this method should be triggered when you hide your widgets
        self.centralWidget.adjustSize()
        self.adjustSize()

请注意,QMainWindowLayout 中还有其他小部件。根据 Qt 文档 中的这张图片,还可能存在 Dock 小部件和其他内容。我只使用了 centralWidget,所以这个解决方案适用于我。

QMainWindow Layout


1

在编程中,QLayout::SizeConstraintQWidget::minimumSizeHintQWidget::minimumSize之间存在层次关系,您可以在文档中找到相关信息。

  • QWidget::minimumSize默认情况下未设置。当设置时,它优先于QWidget::minimumSizeHint
  • 如果小部件不在布局中(意味着可以使用鼠标将其调整为0),则QWidget::minimumSizeHint无效,否则请使用布局定义的大小。
  • QLayout::SizeConstraint保存它直接管理的小部件的默认布局行为。如果您在布局B中嵌套布局A,则添加到A的所有小部件都将使用其属性。此外,如果B中的小部件W定义了自己的布局,则应用这些布局约束来应用于小部件W

了解这一点后,请按照以下步骤操作。它可能有效,我没有尝试过:)

  • 设置您使用的所有小部件的最小大小。
  • 确保所有布局的大小约束设置为QLayout::SetDefaultConstraint

0
这段代码可以解决问题(它只调整高度):
    QWidget widget;
    widget.resize(widget.width(), widget.minimumHeight());

这与 widget.resize(widget.width(), 1) 有何不同?0 和 1 之间有什么区别吗?(我是一个新手,显然可以看出来。) - Joseph Quinsey
你的意思是 widget.minimumHeight() 返回 0 吗?我一直以为它返回所有控件所需的最小尺寸,但我还没有检查该函数实际返回的值。 - sashoalm
这很有帮助,因为当使用停靠窗口小部件时,可以获取顶部/底部停靠窗口小部件的高度,然后将MainWindow的最小大小设置为当前高度减去您希望隐藏的停靠窗口小部件的高度。 - guitarpicva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接