0

无法使此示例中的 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()
4

2 回答 2

2

tl;博士

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

解释

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

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

问题是您将大小策略设置为“最小”,正如QSizePolicy 文档所解释的那样:

sizeHint() 最小且足够。小部件可以扩展 [...]

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

您实际需要的是将水平策略设置为Maximum,特别是Stack设置对象(QStackWidget,不是 QWidget 容器,也不是 QLabel)。 那是因为实际上使用了(同样,来自 QSizePolicy 文档):
MaximumShrinkFlag

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

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

于 2019-08-22T01:42:31.887 回答
0

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

hbox.addWidget(self.rightlist, stretch=1)
于 2019-08-21T15:45:27.427 回答