PyQt5 – 可滚动的标签

  • Post category:Python

当我们需要在QT图形界面中展示大量数据时,如果数据不能全部在一个窗口中显示,就需要使用到可滚动的标签(QScrollArea)。PyQt5也提供了这样的功能,本文将详细讲解如何使用PyQt5中的可滚动的标签。

1. 创建可滚动标签

首先,我们需要用代码创建一个可滚动的标签。下面是一个基本的示例代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QScrollArea

def main():
    app = QApplication(sys.argv)
    window = QWidget()
    scroll_area = QScrollArea()

    # 添加标签内容
    widget = QWidget()
    layout = QVBoxLayout(widget)
    for i in range(100):
        label = QLabel(f'标签{i+1}')
        layout.addWidget(label)

    scroll_area.setWidget(widget)
    scroll_area.setHorizontalScrollBarPolicy(1)
    scroll_area.setVerticalScrollBarPolicy(1)

    vbox = QVBoxLayout()
    vbox.addWidget(scroll_area)
    window.setLayout(vbox)

    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

首先,我们创建了一个QScrollArea对象并设置了它的滚动条,在这个QScrollArea中,我们添加了一个QWidget,并在QWidget中添加了100个QLabel标签。

接着,我们将QWidget对象设置为QScrollArea的“可滚动区域的窗口小部件(setWidget)”。最后,我们创建了一个QVBoxLayout,并将我们的QScrollArea添加至其内部,最终将QVBoxLayout设置为QWidget对象的布局,然后运行我们的QWidget对象。

在这样的设置下,QWidget将被转换为QScrollArea的可滚动区域,所以当QWidget中的内容超过一定程度时,QScrollArea的滚动条会自动出现,以便用户查看所有内容。

2. 添加滑动条和滑块样式

在上面的示例中,我们当然能够看到一个可滚动的标签,但是它的样式非常简单。我们也可以自定义它的样式。下面是一个添加样式的示例:

import sys
from PyQt5.QtGui import QPalette, QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QScrollArea

def main():
    app = QApplication(sys.argv)
    window = QWidget()
    scroll_area = QScrollArea()

    # 添加标签内容
    widget = QWidget()
    layout = QVBoxLayout(widget)
    for i in range(100):
        label = QLabel(f'标签{i+1}')
        layout.addWidget(label)

    scroll_area.setWidget(widget)

    # 设置滑动条风格
    scroll_bar_stylesheet = 'QScrollBar:vertical {background-color: #F5F5F5; width: 12px; margin: 12px 12px 12px 0px;}'\
                             ' QScrollBar::handle:vertical {background-color: #DBDBDB; border-radius: 6px;}'\
                             ' QScrollBar::add-line:vertical {background: none;}'\
                             ' QScrollBar::sub-line:vertical {background: none;}'\
                             ' QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none;}'
    scroll_area.setStyleSheet(scroll_bar_stylesheet)

    # 设置滑块风格
    palette = scroll_area.palette()
    pixmap = QPixmap(20, 20)
    pixmap.fill(Qt.gray)
    palette.setBrush(QPalette.Highlight, Qt.white)
    palette.setBrush(QPalette.HighlightedText, Qt.black)
    scroll_area.setPalette(palette)

    vbox = QVBoxLayout()
    vbox.addWidget(scroll_area)
    window.setLayout(vbox)

    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这次我们设置了滚动条的样式,这里我们采用了一些基本的CSS语法,这也是在PyQt中设置样式的常见方式。

另外,我们也可以设置滑块风格,通过设置QPalette颜色来实现。

这样,我们的可滚动标签就更加美观和实用了。