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
相关产品推荐
相关产品推荐

