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

PySide2实现可拖拽调整宽度的左侧横向标签栏及消除QTabWidget原标签栏占位的问题求助

PySide2实现可拖拽调整宽度的左侧横向标签栏及消除QTabWidget原标签栏占位的问题求助

大家好,我最近在做一个带左侧横向标签栏的QTabWidget,希望能通过鼠标拖拽调整标签栏的宽度。我目前的做法是把QTabWidget放在QSplitter的右侧面板,把它的TabBar单独移到左侧面板,整体功能倒是能用,但有个问题:QTabWidget本身还是会给原标签栏预留一块位置,那块区域现在是空的,看起来很别扭。

我本来想着重写paintEvent方法来解决这个问题,甚至去翻了Qt的源码,但还是没搞明白怎么处理——只知道QTabWidget内部是用QStackedWidget来存放各个页面的,但没办法把这个QStackedWidget单独提取出来使用。

有没有大佬能教教我怎么修改QTabWidget的行为,让它不再给原标签栏留位置?或者有没有其他方法能实现可拖拽调整宽度的侧边标签栏?

下面是我目前的代码:

import sys
from PySide2.QtWidgets import (
    QApplication,
    QMainWindow,
    QSplitter,
    QLabel,
    QTabWidget,
    QTabBar,
    QStylePainter,
)
from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2.QtGui import QPainter, QPaintEvent
from PySide2.QtWidgets import QProxyStyle, QStyle


class TabBar(QTabBar):
    def tabSizeHint(self, index):
        s = QTabBar.tabSizeHint(self, index)
        s.transpose()
        return s

    def paintEvent(self, event):
        painter = QtWidgets.QStylePainter(self)
        opt = QtWidgets.QStyleOptionTab()

        for i in range(self.count()):
            self.initStyleOption(opt, i)
            painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
            painter.save()

            s = opt.rect.size()
            s.transpose()
            r = QtCore.QRect(QtCore.QPoint(), s)
            r.moveCenter(opt.rect.center())
            opt.rect = r

            c = self.tabRect(i).center()
            painter.translate(c)
            painter.rotate(90)
            painter.translate(-c)
            painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)
            painter.restore()


class TabWidget(QtWidgets.QTabWidget):
    def __init__(self, *args, **kwargs):
        QtWidgets.QTabWidget.__init__(self, *args, **kwargs)
        self.setTabBar(TabBar(self))
        self.setTabPosition(QtWidgets.QTabWidget.West)


if __name__ == "__main__":
    app = QApplication()
    mainwindow = QMainWindow()
    splitter = QSplitter()
    tab_widget = TabWidget()
    tab_widget.addTab(QLabel("Tab one"), "Tab one")
    tab_widget.addTab(QLabel("Tab two"), "Tab two tab two")
    l_widget = QtWidgets.QWidget()
    l_layaout = QtWidgets.QVBoxLayout()
    l_widget.setLayout(l_layaout)
    l_layaout.addWidget(tab_widget.tabBar())
    splitter.addWidget(l_widget)
    splitter.addWidget(tab_widget)
    mainwindow.setCentralWidget(splitter)
    mainwindow.showMaximized()
    sys.exit(app.exec_())

备注:内容来源于stack exchange,提问作者Alexandr Shapenkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:33:04