You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:10:09