📅  最后修改于: 2023-12-03 15:33:51.336000             🧑  作者: Mango
在 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 控件将会自动显示滚动条。