It works. I can move a divider by mouse. I need to know how I can do tabs same width then left column.
import sys
from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui
class VTabBar(QtWidgets.QTabBar):
def tabSizeHint(self, index):
s = QtWidgets.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)
if self.tabsClosable(): # repare close button position
optRect = self.tabRect(i)
btn_size = QtCore.QSize(12, 12)
btn_center = QtCore.QPoint(
optRect.x() + optRect.width() - 20,
optRect.y() + optRect.height() - (optRect.height() // 2),
)
optRect.setSize(btn_size)
optRect.moveCenter(btn_center)
self.tabButton(i, QtWidgets.QTabBar.RightSide).setGeometry(optRect)
painter.restore()
class DividedTabWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.__tabBar = VTabBar()
self.__tabBar.setShape(QtWidgets.QTabBar.RoundedWest)
self.__tabBar.setTabsClosable(True)
self.__tabBar.setSizePolicy(
QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed
)
self.__stack = QtWidgets.QStackedWidget()
self.__tabBar.currentChanged.connect(self.__stack.setCurrentIndex)
self.__tabBar.tabCloseRequested.connect(self.removeTab)
def stackedWidget(self):
return self.__stack
def tabBar(self):
return self.__tabBar
def insertTab(self, index, widget, label):
if not widget:
return -1
index = self.__stack.insertWidget(index, widget)
self.__tabBar.insertTab(index, label)
return index
def addTab(self, widget, label):
return self.insertTab(self.__stack.count(), widget, label)
def removeTab(self, index):
self.__tabBar.removeTab(index)
self.__stack.removeWidget(self.__stack.widget(index))
def add_tab():
text = "New tab"
w = QtWidgets.QLabel(text)
tab_widget.addTab(w, text)
if __name__ == "__main__":
app = QtWidgets.QApplication()
mainwindow = QtWidgets.QMainWindow()
splitter = QtWidgets.QSplitter()
tab_widget = DividedTabWidget()
tab_widget.addTab(QtWidgets.QLabel("First tab"), "First tab")
tab_widget.addTab(QtWidgets.QLabel("Second tab"), "Second tab")
tab_widget.addTab(QtWidgets.QLabel("Third tab"), "Third tab")
# left panel
l_widget = QtWidgets.QWidget()
l_layaout = QtWidgets.QVBoxLayout()
l_widget.setLayout(l_layaout)
add_tab_btn = QtWidgets.QPushButton(
"Add new tab"
) # add tab button, it is analog of corner widget
add_tab_btn.clicked.connect(add_tab)
l_layaout.addWidget(add_tab_btn)
l_layaout.addWidget(tab_widget.tabBar())
splitter.addWidget(l_widget)
# right panel
splitter.addWidget(tab_widget.stackedWidget())
mainwindow.setCentralWidget(splitter)
mainwindow.show()
sys.exit(app.exec_())