为QScrollArea设置最小合理宽度

时间:2017-11-14 10:10:58

标签: python qt pyside 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. 注意到垂直空间不足,因此添加了垂直滚动条。

  3. 由于垂直滚动条,水平空间现在也不足,因此也会显示水平滚动条。

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

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

2 个答案:

答案 0 :(得分:2)

您的示例有点不切实际,因为滚动区域是顶级窗口。更典型地,它将是子窗口小部件,并且其初始大小将由布局确定,并且将间接地受到其他窗口小部件和/或布局的大小的约束。作为顶级窗口,约束是不同的,部分受窗口管理器的影响(其确切行为可能因平台而异)。

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

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

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_())

答案 1 :(得分:0)

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

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