天天看點

pyqt5 滾動條QScrollArea()例程

pyqt5 滾動條QScrollArea()例程
  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滾動區域中的控件。而以下這行代碼的含義就是要将滾動區域自帶的橫向滾動條給隐藏掉,因為我們要使用寄己的滾動條:

如果要隐藏縱向滾動條的話,則使用:

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;