为 QScrollArea 设置最小合理宽度

Set minimal reasonable width for a QScrollArea

我对 Qt 比较陌生,我通过 PySide 访问它。

我有一个比较长的内容列表,我想使其可以垂直滚动。 水平尺寸不是问题。为此,我尝试使用 QScrollArea。这是一个最小的例子:

import sys

import PySide.QtGui as gui

application = gui.QApplication(sys.argv)

window = gui.QScrollArea()
list = gui.QWidget()
layout = gui.QVBoxLayout(list)

for i in range(100):
    layout.addWidget(gui.QLabel(
        "A something longish, slightly convoluted example text."))

window.setWidget(list)

window.show()

sys.exit(application.exec_())

会发生什么:

  1. 滚动区域将其水平大小设置为标签所需的大小

  2. 注意到垂直space不够用,所以加了一个垂直滚动条。

  3. 由于垂直滚动条,现在水平space也不够用,所以也显示了水平滚动条。

我可以让水平滚动条消失 setHorizontalScrollBarPolicy,但主要问题仍然存在:垂直滚动条遮挡了部分标签。

如何将滚动区域的宽度设置为不需要水平滚动条的最小值?

尝试在小部件中使用sizeHint(),并使用结果来设置QScrollArea的最小宽度。

这里有一些额外的信息:http://doc.qt.io/qt-5/layout.html

您的示例有点不切实际,因为滚动区域已设为顶级 window。更典型的情况是,它是一个子部件,其初始大小由布局决定,并且会间接受到其他部件 and/or 布局大小的约束。作为顶级 window,约束是不同的,并且部分受到 window-manager 的影响(其确切行为可能因平台而异)。

为确保滚动区域的大小正确,您必须根据其内容为其设置最小宽度,同时还要考虑到垂直滚动条和框架。最好将 widgetResizable 属性 设置为 True 并在内容布局的末尾添加一个可扩展的间隔符。

在下面的示例中,我更改了标签的背景颜色,以便更容易看到发生了什么。我还允许通过在显示后重置最小宽度来将 window 调整为小于其初始大小 - 但这是可选的。

import sys

import PySide.QtGui as gui

application = gui.QApplication(sys.argv)

window = gui.QScrollArea()
window.setWidgetResizable(True)
list = gui.QWidget()
layout = gui.QVBoxLayout(list)

# just for testing
window.setStyleSheet('QLabel {background-color: red}')

for i in range(30):
    layout.addWidget(gui.QLabel(
        "A something longish, slightly convoluted example text."))

layout.addStretch()

window.setWidget(list)

window.setMinimumWidth(
    list.sizeHint().width() +
    2 * window.frameWidth() +
    window.verticalScrollBar().sizeHint().width())

window.show()

# allow resizing smaller
window.setMinimumWidth(1)

sys.exit(application.exec_())