Отступы в вертикальном 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_())

