滚动区域容器QScrollArea
滚动区控件 QScrollArea作为其他控件的容器当其内部的控件超过滚动区的尺寸时滚动区自动提供水平或竖直滚动条,通过拖动滚动条的位置,用户可以看到内部所有控件的内容。例如在滚动区中放置 QLabel控件,用QLabel控件显示图片,当QLabel显示的图片超过 QScrollArea 的范围时,通过拖动滚动条可以看到被挡住的图片。
用QScrollArea类创建实例对象的方法如下所示,其中 parent 是窗口或者容器类控件,它是从抽象类QAbstractScrollArea 继承而来的。
from PySide6.QtWidgets import QScrollArea
QScrollArea(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
滚动区域用于显示框架内子小部件的内容。如果小部件超出了框架的大小,则视图可以提供滚动条,以便可以查看子小部件的整个区域。子小部件必须使用setWidget()指定。例如:
imageLabel = QLabel()
image = QImage("happyguy.png")
imageLabel.setPixmap(QPixmap.fromImage(image))
scrollArea = QScrollArea()
scrollArea.setBackgroundRole(QPalette.Dark)
scrollArea.setWidget(imageLabel)
上面的代码创建了一个包含图像标签的滚动区域(如下图所示)。缩放图像时,滚动区域可以提供必要的滚动条:
滚动条的外观取决于当前设置的滚动条策略。您可以使用scroll bar policies继承的功能来控制QAbstractScrollArea的外观。
例如,您可以设置horizontalScrollBarPolicy 和 verticalScrollBarPolicy 属性。或者,如果您希望滚动条在滚动区域的内容发生变化时动态调整,可以使用horizontalScrollBar()和verticalScrollBar()函数(使您能够访问滚动条),并在滚动区域的内容发生变化时使用setValue()函数设置滚动条的值。
您可以使用widget()函数检索子小部件。可以使用setWidgetResizable()函数使视图可调整大小。可以使用setalign()指定小部件的对齐方式。
两个方便函数确保ensureVisible()和ensureWidgetVisible()确保内容的某个区域在视窗内可见,如有必要,可滚动内容。
大小提示和布局
使用滚动区域显示自定义小部件的内容时,确保将子小部件的大小提示设置为合适的值非常重要。如果将标准QWidget用于子小部件,则可能需要调用setMinimumSize()以确保小部件的内容在滚动区域中正确显示。
如果滚动区域用于显示包含布局中排列的子小部件的内容,重要的是要意识到布局的大小策略也将决定小部件的大小。这对于了解您是否打算动态更改布局的内容特别有用。在这种情况下,将布局的大小约束属性设置为对布局的最小和/或最大大小提供约束的属性(例如g.,setMinAndMaxSize)将导致每当布局内容更改时,滚动区域的大小都会更新。
有关使用QScrollArea类的完整示例,请参阅图像查看器示例。该示例显示如何组合QLabel和QScrollArea以显示图像。
滚动区控件QScrollArea 的属性
-
PySide6.QtWidgets.QScrollArea.alignment: Alignment
此属性保存滚动区域小部件的对齐方式。
有效的对齐方式是Qt.Alignment标志的组合:
(继承枚举.IntFlag)此枚举类型用于描述对齐。它包含水平和垂直标志,可以组合以产生所需的效果。
TextElideMode枚举还可以在许多情况下用于微调对齐文本的外观。
水平标志是:
PySide6.QtCore.Qt.AlignmentFlag | 描述 |
---|---|
AlignCenter | 两个维度的中心。水平垂直居中 |
AlignLeft | 与左边缘对齐。 |
AlignHCenter | 在可用空间中水平居中。 |
AlignRight | 与右边缘对齐。 |
AlignTop | 与顶部对齐。 |
AlignVCenter | 在可用空间中垂直居中。 |
Alignbottom | 与底部对齐。 |
默认情况下,小部件保持根在滚动区域的左上角。
Access functions:
-
alignment()
-
setAlignment(arg__1)
-
PySide6.QtWidgets.QScrollArea.widgetResizable: bool
此属性保存滚动区域是否应调整视图小部件的大小。
如果此属性设置为false(默认值),则滚动区域将尊重其小部件的大小。无论此属性如何,您都可以使用小部件()-> 调整大小()以编程方式调整小部件的大小,滚动区域将自动将其自身调整为新的大小。
如果此属性设置为true,滚动区域将自动调整小部件的大小,以避免滚动条出现在可以避免的地方,或者利用额外的空间。Access functions:
-
widgetResizable()
-
setWidgetResizable(resizable)
-
滚动区控件QScrollArea 的常用方法
滚动区控件QScrollArea 的常用方法
主要方法介绍如下:
-
必须用setWidget(QWidget)方法将某个控件设置成可滚动显示的控件,只有当该控件移出了滚动区控件的窗口,才能用滚动条移动控件。
-
用setAlignment(Qt.Alignment)方法设置QScrollArea 内部控件的对齐位置,其中参数 Qt.Alignment 可以取:
PySide6.QtCore.Qt.AlignmentFlag 描述 AlignCenter 两个维度的中心。水平垂直居中 AlignLeft 与左边缘对齐。 AlignHCenter 在可用空间中水平居中。 AlignRight 与右边缘对齐。 AlignTop 与顶部对齐。 AlignVCenter 在可用空间中垂直居中。 Alignbottom 与底部对齐。 -
用setHorizontalScrollBarPolicy(PySide6.QtCore.Qt.ScrollBarPolicy)方法和 setVerticalScrollBarPolicy(PySide6.QtCore.Qt.ScrollBarPolicy)方法设置竖直滚动条和水平滚动条出现的策略,其中参数 QScrollBarPolicy可以取:
PySide6.QtCore.Qt.ScrollBarPolicy 此枚举类型描述了QAbstractScrollArea滚动条的各种模式。
Constant Description Qt.ScrollBarAsNeeded 当内容太大而无法容纳时,qabstract scrollarea会显示滚动条,否则不会显示滚动条。这是默认值。 Qt.ScrollBarAlwaysOff QAbstractScrollArea从不显示滚动条。 Qt.ScrollBarAlwaysOn QAbstractScrollArea始终显示滚动条。此属性在具有瞬态滚动条的系统上被忽略(例如,在10.7版的Mac上)。 -
使得滚动区域内容可见
-
ensureVisible(x:int,y:int[,xmargin:int=50[,ymargin:int=50]])
滚动滚动区域的内容,使点(x,y)在视口的区域内可见,边距以像素为单位,由xedge和yedge指定。如果无法到达指定点,则将内容滚动到最近的有效位置。两个边距的默认值为50像素。
-
ensureWidgetVisible(childWidget:QWidget[,xmargin:int=50[,ymargin:int=50]])
滚动滚动区域的内容,以便窗口childWidget小部件在视窗内可见,边距以像素为单位,由xedge和yedge指定。如果无法到达指定点,则将内容滚动到最近的有效位置。两个边距的默认值为50像素。
-
滚动区控件 QScrollArea 的常用方法如表所示:
QScrollArea的方法及参数类型 | 说明 |
---|---|
setWidget(QWidget) | 将某个控件设置成可滚动显示的控件 设置滚动区域的小部件。 该小部件将成为滚动区域的子部件,并在删除滚动区域或设置新小部件时被销毁。 小部件的autoFillBackground 属性将设置为true。 如果在添加小部件时滚动区域可见,则必须显式show()请注意,在调用此函数之前,必须添加小部件的布局; 如果稍后添加,小部件将不可见-无论您何时show()滚动区域。在这种情况下,您以后也不能show()小部件。 |
widget() | 返回滚动区域的小部件,如果没有,则返回None。 |
takeWidget()->PySide6.QtWidgets.QWidget | 删除滚动区域的小部件,并将小部件的所有权传递给调用方。 |
setWidgetResizable(bool) | 设置内部控件是否可调节尺寸,尽量不显示滚动条 |
widgetResizable() | 获取内部控件是否可以调节尺寸 |
setAlignment(Qt.Alignment) | 设置内部控件在滚动区的对齐位置 |
aligament() | 返回内部控件在滚动区的对齐位置 |
ensureVisible(x:int,y:int[,xmargin:int=50[,ymargin:int=50]]) | 滚动滚动区域的内容,使点(x,y)在视口的区域内可见,边距以像素为单位,由xedge和yedge指定。如果无法到达指定点,则将内容滚动到最近的有效位置。两个边距的默认值为50像素。 |
ensureWidgetVisible(childWidget:QWidget[,xmargin:int=50[,ymargin:int=50]]) | 滚动滚动区域的内容,以便窗口childWidget小部件在视窗内可见,边距以像素为单位,由xedge和yedge指定。如果无法到达指定点,则将内容滚动到最近的有效位置。两个边距的默认值为50像素。 |
setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy) | 设置竖直滚动条的显示策略 |
setVerticalScrollBarPolicy(Qt.ScrollBarPolicy) | 设置水平滚动条的显示策略 |
滚动区控件QScrollArea的应用实例
# -*- coding: UTF-8 -*-
# File date: Hi_2023/2/28 21:52
# File_name: 04-滚动区控件QScrollArea的应用实例.py
import sys
from PySide6.QtWidgets import QApplication,QWidget,QLabel,QHBoxLayout,QScrollArea
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt
class MyWindow(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.setupUi()
def setupUi(self): # 建立界面上的控件
self.resize(300,300)
self.scroArea = QScrollArea(self)
label = QLabel(self.scroArea)
pix = QPixmap("../../Resources/animal/m1.png")
pix = pix.scaled(666,666,Qt.AspectRatioMode.IgnoreAspectRatio)# 调整图像大小
label.resize(pix.width(),pix.height())# 设置标签的宽度和高度
label.setPixmap(pix)
self.scroArea.ensureVisible(150,100)# 设置可滚动显示的控件
self.scroArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)# 设置对齐方式
self.scroArea.setWidget(label)# 设置可见点
self.scroArea.setAlignment(Qt.AlignCenter)# 设置显示策略
self.scroArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)# 设置显示策略
self.h = QHBoxLayout(self)# 布局
self.h.addWidget(self.scroArea)
if __name__ =='__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())