📜  PyQt5 - 可滚动标签(1)

📅  最后修改于: 2023-12-03 15:33:51.336000             🧑  作者: Mango

PyQt5 - 可滚动标签

在 PyQt5 中,我们可以使用 QTabWidget 控件来创建一个带有标签的窗口,可以方便地切换不同的界面。但是,如果标签数量过多,会导致窗口变得拥挤,不便于操作。此时,我们可以使用可滚动标签来解决这个问题。

实现方法

我们可以自定义一个 QWidget 控件,然后在其中放置一个 QTabBar 控件作为标签栏,再将 QStackedWidget 控件作为子控件添加进去,从而实现一个可滚动的标签窗口。

from PyQt5.QtWidgets import QWidget, QTabBar, QVBoxLayout, QStackedWidget, QScrollArea

class ScrollingTabWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
    
        self.tab_widget = QTabBar()
        self.tab_widget.setExpanding(False)
    
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)

        self.scroll_widget = QWidget()
        self.scroll_layout = QVBoxLayout(self.scroll_widget)

        self.stacked_widget = QStackedWidget()

        self.scroll_area.setWidget(self.scroll_widget)

        layout = QVBoxLayout(self)
        layout.addWidget(self.tab_widget)
        layout.addWidget(self.scroll_area)

        self.tab_widget.currentChanged.connect(self.stacked_widget.setCurrentIndex)

    def add_tab(self, widget, label):
        index = self.stacked_widget.addWidget(widget)
        self.scroll_layout.addWidget(label)
        self.tab_widget.addTab(label)
        self.tab_widget.setTabData(index, widget)
使用方法
from PyQt5.QtWidgets import QApplication, QLabel
import sys

app = QApplication(sys.argv)

scrolling_tab_widget = ScrollingTabWidget()

for i in range(10):
    scrolling_tab_widget.add_tab(QLabel(f'Page {i}'), QLabel(f'Tab {i}'))

scrolling_tab_widget.show()

sys.exit(app.exec_())

在上面的例子中,我们新建了一个 ScrollingTabWidget 控件,并且往里面添加了 10 个标签页。每个标签页的内容是一个 QLabel 控件,Tab 的名称为 'Tab i',Page 的名称为 'Page i'。最后,我们将控件显示出来。

注意事项

由于 QScrollArea 控件默认情况下只会将其第一个子控件作为滚动控件来使用,所以我们需要在滚动区域内新建一个 QWidget 控件,将其用作滚动控件。此外,还需要将 QTabBar 控件的大小设为不可变(setExpanding(False)),这样在标签过多时,QTabBar 控件将会自动显示滚动条。