如何在PySide6的TabWidget标签旁添加新建标签按钮?
在TabWidget标签旁添加新建标签按钮的实现思路
我希望在TabWidget的已打开标签旁边添加一个新建标签按钮(类似浏览器的样式)。但现有的默认布局均不支持将元素堆叠并同时显示二者。网格布局最多只能将它们并排显示,且会把按钮放在最外侧。
最小可运行代码(原示例)
from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QTabWidget, QLabel, QGridLayout ) class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.container = QWidget() # Controls container widget. self.controlsLayout = QVBoxLayout() # Controls container layout. Might need to be Horizontal with Veritical for some. # Add stuff here before # See https://pythonbasics.org/pyqt-tabwidget/ on tab widgets self.tabs_layout = QGridLayout() self.tabs = QTabWidget() label1 = QLabel("Widget in Tab 1.") # have classes for each page self.tabs.addTab(label1, "First") self.tabs.addTab(label1, "Second") self.tabs_layout.addWidget(self.tabs, 1, 0) # Add new tab button self.new_tab_button = QPushButton("+") self.tabs_layout.addWidget(self.new_tab_button, 0, 1) self.controlsLayout.addLayout(self.tabs_layout)
我知道这是可以实现的,因为像Konsole这类基于Qt开发的应用就具备该功能。
实现思路及修正代码
核心方案:直接操作QTabBar布局
不要使用外部网格布局,而是利用QTabWidget内置的标签栏(QTabBar)来添加按钮,这样按钮会自动和标签并排显示在标签栏末尾,完全匹配浏览器样式,且无需手动处理位置适配。
修正后的可运行代码
from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QTabWidget, QLabel, QPushButton, QMainWindow ) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.container = QWidget() self.controlsLayout = QVBoxLayout(self.container) self.tabs = QTabWidget() label1 = QLabel("Widget in Tab 1.") self.tabs.addTab(label1, "First") self.tabs.addTab(label1, "Second") # 给标签栏添加新建按钮 self.new_tab_button = QPushButton("+") # 关闭标签自动拉伸,确保按钮固定在末尾 self.tabs.tabBar().setExpanding(False) # 将按钮添加到标签栏的布局中 self.tabs.tabBar().addWidget(self.new_tab_button) self.controlsLayout.addWidget(self.tabs) self.setCentralWidget(self.container) if __name__ == "__main__": import sys from PySide6.QtWidgets import QApplication app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
说明
- 直接通过
self.tabs.tabBar()获取标签栏控件,调用addWidget方法即可将按钮嵌入标签栏,和现有标签自然排列 - 设置
setExpanding(False)可以避免标签自动拉伸占满整个标签栏,保证按钮始终显示在最右侧 - 这种方式无需绝对定位,窗口大小变化时按钮会自动跟随标签栏调整位置,维护成本更低
内容的提问来源于stack exchange,提问作者David Frick
相关产品推荐
相关产品推荐

