pyqt5 滚动条QScrollArea()例程

本文介绍如何使用PyQt5的QScrollArea和QScrollBar实现图片的缩放功能,通过自定义Zoomin和Zoomout按钮,以及同步滚动条与图片滚动,为用户提供流畅的图片浏览体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  1. 滚动区域QScrollArea

  2. 滚动条QScrollBar

  3. Zoom in按钮和Zoom out按钮分别用于放大缩小图片

代码如下:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QScrollArea, QScrollBar, \
                            QHBoxLayout, QVBoxLayout


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.label = QLabel(self)                              # 1
        self.label.setPixmap(QPixmap('image.jpg'))
        self.label.setScaledContents(True)

        self.scroll_area = QScrollArea(self)                   # 2
        self.scroll_area.setWidget(self.label)
        self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.scrollbar = QScrollBar(Qt.Horizontal, self)       # 3
        self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())

        self.bigger_btn = QPushButton('Zoom in', self)         # 4
        self.smaller_btn = QPushButton('Zoom out', self)

        self.bigger_btn.clicked.connect(self.bigger_func)      # 5
        self.smaller_btn.clicked.connect(self.smaller_func)
        self.scrollbar.valueChanged.connect(self.sync_func)

        self.h_layout = QHBoxLayout()                        
        self.h_layout.addWidget(self.bigger_btn)
        self.h_layout.addWidget(self.smaller_btn)

        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.scroll_area)
        self.v_layout.addWidget(self.scrollbar)
        self.v_layout.addLayout(self.h_layout)
        self.setLayout(self.v_layout)

    def bigger_func(self):
        self.label.resize(self.label.width()*1.2, self.label.height()*1.2)
        self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())

    def smaller_func(self):
        self.label.resize(self.label.width() * 0.8, self.label.height() * 0.8)
        self.scrollbar.setMaximum(self.scroll_area.horizontalScrollBar().maximum())

    def sync_func(self):
        self.scroll_area.horizontalScrollBar().setValue(self.scrollbar.value())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

1 实例化一个QLabel控件用于显示大图。setScaledContents(True)方法可以让图片随着QLabel控件大小变化而变化,即自适应;

2 实例化一个QScrollArea控件,调用setWidget()方法将QLabel滚动区域中的控件。而以下这行代码的含义就是要将滚动区域自带的横向滚动条给隐藏掉,因为我们要使用寄己的滚动条:

self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

如果要隐藏纵向滚动条的话,则使用:

self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

3 实例化一个横向滚动条,并调用setMaximum()方法设置最大值。而它的最大值应该跟QScrollArea被隐藏掉的横向滚动条的最大值一样;

4 实例化两个按钮用于放大缩小QLabel控件(图片也会相应的放大缩小);

5 信号和槽函数连接。在bigger_func()槽函数中,我们将QLabel控件放大20%,同时设置QScrollBar的最大值为QScrollArea横向滚动条的最大值;在smaller_func()槽函数中,我们将QLabel控件缩小20%,同样要更新QScrollBar的最大值;在sync_func()槽函数中,我们让QScrollArea横向滚动条的当前值和QScrollBar的值同步。这样一来就相当于我们在用自己实例化的QScrollBar来控制滚动区域中的图片(相信某些读者会有这样的需求)。

图片下载

小结

1 可以将QLabel换成一个QWidget,而这个QWidget中包含许多子控件,这样做可以节省许多界面空间;

2 QScrollBar当然不一定要跟QScrollArea一起使用,我们也可以将它看成一个QSlider;

PyQt6中,QScrollArea是一个能够提供滚动功能的容器小部件,它允许用户在子部件大小超出其可视区域时滚动查看。如果你希望在初始化QScrollArea时,滚动条默认滚动到底部,你可以通过编程的方式设置垂直滚动条的当前位置。 以下是如何设置QScrollArea的垂直滚动条默认位置到底部的方法: 1. 使用`setVerticalScrollBarPolicy`方法设置滚动条策略。通常我们希望滚动条一直显示,因此可以设置为`Qt.ScrollBarAlwaysOn`。 2. 使用`verticalScrollBar().setValue`方法设置垂直滚动条的值。这个值应该设置为滚动区域的可视高度减去内容区域的总高度,这样滚动条就会出现在底部。 示例代码如下: ```python from PyQt6.QtWidgets import QApplication, QWidget, QScrollArea, QVBoxLayout, QPushButton, QHBoxLayout, QLabel from PyQt6.QtCore import Qt class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("PyQt6 QScrollArea 示例") self.setGeometry(300, 300, 400, 400) # 创建滚动区域 scroll_area = QScrollArea() scroll_area.setWidgetResizable(True) # 设置部件大小可调整 scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) # 设置滚动条策略 # 创建一个内部部件来放置内容 scroll_widget = QWidget() scroll_layout = QVBoxLayout(scroll_widget) # 添加一些内容 for i in range(20): label = QLabel(f"内容 {i}") scroll_layout.addWidget(label) # 将内部部件添加到滚动区域 scroll_area.setWidget(scroll_widget) # 设置滚动条到底部 scroll_area.verticalScrollBar().setValue(scroll_area.verticalScrollBar().maximum()) # 创建布局并添加滚动区域 main_layout = QHBoxLayout(self) main_layout.addWidget(scroll_area) if __name__ == '__main__': app = QApplication([]) window = Window() window.show() app.exec() ``` 在这段代码中,我们创建了一个带有多个`QLabel`的窗口,并将这些标签放置在一个`QScrollArea`中。在设置完滚动区域的内容后,我们通过`setValue`方法将垂直滚动条设置为最大值,从而使滚动条滚动到底部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值