79427731

Date: 2025-02-10 16:47:14
Score: 0.5
Natty:
Report link

It works. I can move a divider by mouse. I need to know how I can do tabs same width then left column.

window screenshot

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_())
Reasons:
  • Blacklisted phrase (0.5): I need
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (1):
Posted by: Alexandr Shapenkov