如何将 QStackedWidget 大小设置为子小部件的最小尺寸?

Posted

技术标签:

【中文标题】如何将 QStackedWidget 大小设置为子小部件的最小尺寸?【英文标题】:How to set QStackedWidget size to child widgets minimum size? 【发布时间】:2019-08-21 13:48:07 【问题描述】:

无法使此示例中的 QLabel 达到包含其文本的最小大小。我需要布局和堆叠的小部件,然后将它们自己调整到适合标签所需的最小值。

我使用来自https://www.tutorialspoint.com/pyqt/pyqt_qstackedwidget.htm 的代码来演示我的问题。

在应用程序启动时设置大小策略似乎有效,但增加应用程序宽度最终会导致标签在列表达到一定宽度后展开。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class stackedExample(QWidget):

    def __init__(self):
        super(stackedExample, self).__init__()
        self.rightlist = QListWidget()
        self.rightlist.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)

        self.rightlist.insertItem(0, 'Contact')

        self.stack1 = QWidget()
        self.stack1.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Minimum)

        self.stack1UI()

        self.Stack = QStackedWidget(self)
        self.Stack.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Minimum)
        self.Stack.addWidget(self.stack1)

        hbox = QHBoxLayout(self)
        hbox.addWidget(self.Stack)
        hbox.addWidget(self.rightlist)


        self.setLayout(hbox)
        self.rightlist.currentRowChanged.connect(self.display)
        self.setGeometry(300, 50, 10, 10)
        self.setWindowTitle('StackedWidget demo')
        self.show()


    def stack1UI(self):
        layout = QVBoxLayout()
        label = QLabel("Hello World")
        label.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Minimum)
        label.setStyleSheet("QLabel  background-color : red; color : blue; ")
        layout.addWidget(label)
        self.stack1.setLayout(layout)


    def display(self, i):
        self.Stack.setCurrentIndex(i)

def main():
    app = QApplication(sys.argv)
    ex = stackedExample()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

tl;博士

删除除 QStackedWidget 之外的所有内容的大小策略设置(您必须将水平策略设置为 Maximum),一切都应该没问题。

说明

我不得不承认:我一直觉得 QSizePolicy 枚举名称令人困惑(我知道我不是唯一一个),所以我很同情你的怀疑。

设置拉伸只能部分解决问题,因为有时您可能需要或想要手动设置拉伸,这可能会与某些尺寸政策混淆。

问题在于您将尺寸政策设置为“最小”,正如QSizePolicy documentation 解释的那样:

sizeHint() 是最小的,并且足够了。小部件可以展开 [...]

那是因为Minimum 使用了GrowFlag。 这意味着,如果布局“认为”小部件有一些可用空间,它将让它扩展:Minimum 并不意味着小部件将使用它的最小尺寸(或者,更好的是,它的 minimumSizeHint()),但是它将使用sizeHint() 作为布局的最小尺寸,同时保持其容量扩展;如果有可用空间,它将使用它。

您真正需要的是将水平策略设置为 Maximum,具体来说,设置为 Stack 对象(QStackWidget,不是 QWidget 容器,也不是 QLabel) . 那是因为Maximum 实际上使用了ShrinkFlag(同样来自 QSizePolicy 文档):

sizeHint() 是一个最大值。小部件可以缩小任意数量 如果其他小部件需要空间(例如分隔符),则不会损害 线)。它不能大于 sizeHint() 提供的大小。

也就是说,请注意在某些情况下 QLabels 存在已知问题,特别是如果标签有自动换行。

【讨论】:

太棒了!感谢您的澄清!看来我以后需要花更多的时间阅读文档了!【参考方案2】:

不确定这是否是正确的方法,但添加拉伸因子似乎已经达到了我想要的效果。

hbox.addWidget(self.rightlist, stretch=1)

【讨论】:

以上是关于如何将 QStackedWidget 大小设置为子小部件的最小尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

将 QStackedWidget 调整为打开的页面[重复]

滑动 QStackedWidget 页面

如何在具有自动布局的容器视图中将 UITableView 的大小设置为子视图

在 QStackedWidget 页面中调整布局大小

Qt QStackedWidget 调整大小问题

将自定义小部件添加到 QStackedWidget