Python 什么';QSizePolicy.Minimum和QSizePolicy.Preferred的区别是什么?

Python 什么';QSizePolicy.Minimum和QSizePolicy.Preferred的区别是什么?,python,pyqt,pyside,qsizepolicy,Python,Pyqt,Pyside,Qsizepolicy,我读到“首选策略是非常灵活的策略,小部件的大小可以小于或大于sizeHint()” 但是,当我增加或减少窗口的大小时,我找不到它们之间的任何差异 from PySide2 import QtWidgets app = QtWidgets.QApplication([]) window = QtWidgets.QWidget() layout = QtWidgets.QVBoxLayout() vMinimumButton = QtWidgets.QPushButton("h_Mi

我读到“首选策略是非常灵活的策略,小部件的大小可以小于或大于sizeHint()”
但是,当我增加或减少窗口的大小时,我找不到它们之间的任何差异

from PySide2 import QtWidgets

app = QtWidgets.QApplication([])

window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
vMinimumButton = QtWidgets.QPushButton("h_Minimum, v_Fixed")
hMinimumButton = QtWidgets.QPushButton("h_Fixed, v_Minimum")
bMinimumButton = QtWidgets.QPushButton("h_Minimum, v_Minimum")

vMinimumButton.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
hMinimumButton.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
bMinimumButton.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)

layout.addWidget(vMinimumButton)
layout.addWidget(hMinimumButton)
layout.addWidget(bMinimumButton)
window.setLayout(layout)
window.show()

app.exec_()

from PySide2 import QtWidgets

app = QtWidgets.QApplication([])

window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
vPreferredButton = QtWidgets.QPushButton("h_Preferred, v_Fixed")
hPreferredButton = QtWidgets.QPushButton("h_Fixed, v_Preferred")
bPreferredButton = QtWidgets.QPushButton("h_Preferred, v_Preferred")

vPreferredButton.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
hPreferredButton.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
bPreferredButton.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)

layout.addWidget(vPreferredButton)
layout.addWidget(hPreferredButton)
layout.addWidget(bPreferredButton)
window.setLayout(layout)
window.show()

app.exec_()
这在Qt文档的第页中介绍

“首选”政策允许从暗示的规模缩小和扩大控制。“最低”政策只允许增长

后者绝不能让你缩小到暗示的尺寸以下

这些策略是策略标志的不同组合,详细说明如下:

  • QSizePolicy::GrowFlag=1
    :如果需要,小部件可以超出其大小提示
  • QSizePolicy::ExpandFlag=2
    :小部件应获得尽可能多的空间
  • QSizePolicy::ShrinkFlag=4
    :如果需要,小部件可以缩小到其大小提示以下
  • QSizePolicy::IgnoreFlag=8
    :忽略小部件的大小提示。小部件将获得尽可能多的空间
这在Qt文档的第页中介绍

“首选”政策允许从暗示的规模缩小和扩大控制。“最低”政策只允许增长

后者绝不能让你缩小到暗示的尺寸以下

这些策略是策略标志的不同组合,详细说明如下:

  • QSizePolicy::GrowFlag=1
    :如果需要,小部件可以超出其大小提示
  • QSizePolicy::ExpandFlag=2
    :小部件应获得尽可能多的空间
  • QSizePolicy::ShrinkFlag=4
    :如果需要,小部件可以缩小到其大小提示以下
  • QSizePolicy::IgnoreFlag=8
    :忽略小部件的大小提示。小部件将获得尽可能多的空间

我想补充一些见解,而不是简练但完整的

首先,乍一看,Qt大小策略名称是违反直觉的。
理解它们需要仔细耐心地理解文档,可能还需要一些测试。一旦你了解了它的要点,你可能会意识到命名背后的逻辑和假设,而且它实际上是有意义的(不直观并不总是意味着错误:复杂的主题需要更多的意识,以避免仅仅基于直觉的错误选择)

需要理解的重要一点是,它们总是引用小部件的大小提示,并指示如何将该提示用作引用

Maximum
表示提示将用作小部件的最大大小:它不能大于该大小。
Minimum
表示提示是最小大小,因此不能更小。
请记住
最小值*
最大值*
(其中
*
大小
宽度
高度
)覆盖了这些方面。
展开
意味着提示是首选大小,如果还有一些空间,小部件将尝试使用它

我们必须考虑QWIDGET也有一个建议的最小大小:如果它返回一个有效的大小,它不能更小(再一次,除非显式给出最小大小)。 我们还必须认识到,一些小部件具有特殊的行为,这也解释了为什么您看不到代码中的差异:例如,QPushButton返回

sizeHint()
,即使对于
minimumSizeHint()
,它也基于其内容,并且仅对其宽度有效;默认情况下,Qt按钮具有固定高度

一如既往,实验是理解行为的完美方式。
下面是一个基本的例子,可以更好地说明政策是如何运作的;使用基本QWidget作为基础可以避免由特定于小部件的提示和策略导致的意外行为

您可以使用上下文菜单设置策略,然后最终调整窗口大小以查看结果。显示的值显示当前策略和大小提示

from PySide2 import QtCore, QtGui, QtWidgets

policyNames = 'Fixed', 'Minimum', 'Maximum', 'Preferred', 'Expanding'
policyNameDict = {}
policyValueDict = {}
for name in policyNames:
    policy = getattr(QtWidgets.QSizePolicy, name)
    policyNameDict[policy] = name
    policyValueDict[name] = policy

class TestWidget(QtWidgets.QWidget):
    def sizeHint(self):
        return QtCore.QSize(150, 30)

    def minimumSizeHint(self):
        return QtCore.QSize(10, 10)

    def contextMenuEvent(self, event):
        currentPolicy = self.sizePolicy()
        menu = QtWidgets.QMenu()
        group = QtWidgets.QActionGroup(menu, exclusive=True)
        for name in policyNames:
            action = group.addAction(name)
            action.setCheckable(True)
            policy = policyValueDict[name]
            action.setData(policy)
            if policy == currentPolicy.horizontalPolicy():
                action.setChecked(True)
        menu.addActions(group.actions())
        res = menu.exec_(event.globalPos())
        if res:
            # PySide requires reconversion of the data, on PyQt the
            # res.data() alone is enough;
            currentPolicy.setHorizontalPolicy(
                QtWidgets.QSizePolicy.Policy(res.data()))
            self.setSizePolicy(currentPolicy)
            self.update()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.drawRect(self.rect().adjusted(0, 0, -1, -1))
        text = '{policy}\n{width}x{height}'.format(
            policy=policyNameDict[self.sizePolicy().horizontalPolicy()], 
            width=self.sizeHint().width(), 
            height=self.sizeHint().height(), 
        )
        qp.drawText(self.rect(), QtCore.Qt.AlignCenter, text)


app = QtWidgets.QApplication([])

window = QtWidgets.QWidget()
layout = QtWidgets.QHBoxLayout(window)
for i in range(3):
    layout.addWidget(TestWidget())
window.show()

app.exec_()

我想补充一些见解,而不是简练但完整的

首先,乍一看,Qt大小策略名称是违反直觉的。
理解它们需要仔细耐心地理解文档,可能还需要一些测试。一旦你了解了它的要点,你可能会意识到命名背后的逻辑和假设,而且它实际上是有意义的(不直观并不总是意味着错误:复杂的主题需要更多的意识,以避免仅仅基于直觉的错误选择)

需要理解的重要一点是,它们总是引用小部件的大小提示,并指示如何将该提示用作引用

Maximum
表示提示将用作小部件的最大大小:它不能大于该大小。
Minimum
表示提示是最小大小,因此不能更小。
请记住
最小值*
最大值*
(其中
*
大小
宽度
高度
)覆盖了这些方面。
展开
意味着提示是首选大小,如果还有一些空间,小部件将尝试使用它

我们必须考虑QWIDGET也有一个建议的最小大小:如果它返回一个有效的大小,它不能更小(再一次,除非显式给出最小大小)。 我们还必须认识到,一些小部件具有特殊的行为,这也解释了为什么您看不到代码中的差异:例如,QPushButton返回

sizeHint()
,即使对于
minimumSizeHint()
,它也基于其内容,并且仅对其宽度有效;默认情况下,Qt按钮具有固定的高度