为 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_())
会发生什么:
滚动区域将其水平大小设置为标签所需的大小
注意到垂直space不够用,所以加了一个垂直滚动条。
由于垂直滚动条,现在水平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_())
我对 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_())
会发生什么:
滚动区域将其水平大小设置为标签所需的大小
注意到垂直space不够用,所以加了一个垂直滚动条。
由于垂直滚动条,现在水平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_())