如何将 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 大小设置为子小部件的最小尺寸?的主要内容,如果未能解决你的问题,请参考以下文章