Отступы в вертикальном QTabWidget

Нашел решение как сделать QTabWidget с вертикальными вкладками, но ни как не могу выставить setContentsMargins, так как в предложенном решении отступы равны 0.

введите сюда описание изображения

import sys
from PyQt5.QtCore import QPoint, QRect
from PyQt5.QtWidgets import *


class VerticalQTabBar(QTabBar):

    def tabSizeHint(self, index: int):

        s = QTabBar.tabSizeHint(self, index)
        s.transpose()
        return s

    def paintEvent(self, event):

        painter = QStylePainter(self)
        opt = QStyleOptionTab()

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

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

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


class VerticalQTabWidget(QTabWidget):
    def __init__(self, *args, **kwargs):
        QTabWidget.__init__(self, *args, **kwargs)

        self.setTabBar(VerticalQTabBar(self))
        self.setTabPosition(QTabWidget.West)
        self.setContentsMargins(200, 200, 200, 200)


class Main(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.resize(1366, 900)
        self.setWindowTitle("Test App")

        self.__main_window_build()

    def __main_window_build(self):

        welcome_tab = QGroupBox("SomeBox")

        tabwidget = VerticalQTabWidget()
        tabwidget.addTab(welcome_tab, "Fancy Welcome Tab")

        h_layout = QHBoxLayout(self.centralWidget)
        # h_layout.setContentsMargins(10, 10, 10, 10)
        h_layout.addWidget(tabwidget)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyle("Fusion")
    ex = Main()
    ex.show()
    sys.exit(app.exec_())

Можно добавить какой-то промежуточный класс QWidget

class CustomQ(QWidget):
    def __init__(self):
        super().__init__()

        box = QGroupBox("SomeBox")
        h_box = QHBoxLayout(self)
        h_box.addWidget(box)

И изменить в приложении welcome_tab = CustomQ() - такое решение выглядит как "костыль". Хотелось бы понять, как обойтись без дополнительного класса? введите сюда описание изображения


Ответы (1 шт):

Автор решения: S. Nick

Хотя в том что вы обернете QGroupBox нет ничего плохого, а чтобы обойтись без этого вам в помощь таблица стилей.

Вот некоторые из возможных:

    QGroupBox {
        margin: 1ex 3ex 3ex 3ex;
        font-size: 10pt;
        background-color: #C9D8B6;
    }        
    QGroupBox::title {
        subcontrol-origin: margin;
        left: 4ex;
        top: 1ex;
        color: #FF7777;
    }
    QGroupBox:enabled {
        border: 3px solid #57837B;
        border-radius: 5px;
        margin: 7ex 3ex 3ex 3ex;
    }  

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


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

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

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

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

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


class VerticalQTabWidget(QTabWidget):
    def __init__(self, *args, **kwargs):
        QTabWidget.__init__(self, *args, **kwargs)

        self.setTabBar(VerticalQTabBar(self))
        self.setTabPosition(QTabWidget.West)

# ???        self.setContentsMargins(200, 200, 200, 200)


class Main(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.resize(1200, 600)
        self.setWindowTitle("Test App")

        self.__main_window_build()

    def __main_window_build(self):
        welcome_tab = QGroupBox("SomeBox")

        self.setStyleSheet('''
        QGroupBox {
            margin: 1ex 3ex 3ex 3ex;
            font-size: 10pt;
            background-color: #C9D8B6;
        }        
        QGroupBox::title {
            subcontrol-origin: margin;
            left: 4ex;
            top: 1ex;
            color: #FF7777;
        }
        QGroupBox:enabled {
            border: 3px solid #57837B;
            border-radius: 5px;
            margin: 7ex 3ex 3ex 3ex;
        }        
        ''')

        tabwidget = VerticalQTabWidget()
        tabwidget.addTab(welcome_tab, "Fancy Welcome Tab")

        h_layout = QHBoxLayout(self.centralWidget)
        # h_layout.setContentsMargins(10, 10, 10, 10)
        h_layout.addWidget(tabwidget)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyle("Fusion")
    ex = Main()
    ex.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка