Можно ли кастомизировать QTabWidget определенным образом?(PyQt 5, Python 3)
У меня появилась идея. Я понимаю, что она трудновыполнимая, но не знаю насколько. Мне нужно изменить внешний вид виджета QTabWidget следующим образом:
- В заголовки вкладок поместить изображения(обычные, без особых характеристик)
- Закруглить все возможные края всех вкладок
- Убрать рамку(обводку)
- Задать цвета активной и неактивной вкладок
- Перевернуть виджет так, как я нарисовал на картинке:
Я пытался убрать рамку вкладок в таблице стиля, но это не работает так, как с другими виджетами. Пытался что-то загуглить, но не нашел ничего полезного. Теперь мне кажется, что я слишком много хочу. Можно ли реализовать задуманное? Если можно, пожалуйста, подскажите как
from PyQt5 import QtWidgets
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
tab = QtWidgets.QTabWidget()
tab.addTab(QtWidgets.QLabel('1'), 'Вкладка 1')
tab.addTab(QtWidgets.QLabel('2'), 'Вкладка 2')
tab.setCurrentIndex(0)
tab.setStyleSheet('''border-style: hidden;
border-width: 2px;
border-radius: 10px;''')
box = QtWidgets.QVBoxLayout(self)
box.addWidget(tab)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('QTabWidget')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Много задавать вопросов (в одном посте) не слишком здорово. Реализовать можно практический все, только торопится не надо.
Мне увиделась ваша задача так. Только подобрать цвета и сделать закругления попробуйте сразу самостоятельно. Почитайте посты с ключевыми словами Style Sheet.
Вы также можете увидит другую реализацию вашей идеи Pyqt 5 изменение текущий элемент в QListWidget
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class Color(QtWidgets.QWidget):
def __init__(self, color, *args, **kwargs):
super(Color, self).__init__(*args, **kwargs)
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QtGui.QPalette.Window, QtGui.QColor(color))
self.setPalette(palette)
class TabBar(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);
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)
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.setFixedSize(800, 400)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) # !!!
self.tabs = TabWidget() # QtWidgets.QTabWidget()
self.tabs.setTabPosition(QtWidgets.QTabWidget.West) #
self.tabs.setDocumentMode(True)
self.tabs.setMovable(True)
self.tabs.addTab(QtWidgets.QLabel('1', alignment=QtCore.Qt.AlignCenter),
QIcon('images/info.ico'), '') # 'Вкладка 1'
self.tabs.addTab(QtWidgets.QLabel('2'), QIcon('head3.png'), '') # , 'Вкладка 2'
self.tabs.setIconSize(QtCore.QSize(50, 50))
for n, color in enumerate(['red','green','blue','yellow']):
self.tabs.addTab( Color(color), color)
self.tabs.setCurrentIndex(0)
box = QtWidgets.QVBoxLayout(self)
box.addWidget(self.tabs)
box.setContentsMargins(0, 0, 0, 0)
def closeTab(self, index):
tab = self.tabs.widget(index)
tab.deleteLater()
self.tabs.removeTab(index)
qss = '''
QTabBar {
background: #c3c3c3;
}
QTabBar::tab {
background: rgb(34, 137, 163);
color: white;
}
QTabBar::tab:selected {
background-color: rgb(48, 199, 184,);
color: #000000;
}
QLabel {
background-color: #23272a;
font-size: 22px;
padding-left: 5px;
color: white;
}
'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(qss) # +
window = MyWindow()
window.setWindowTitle('QTabWidget')
window.show()
sys.exit(app.exec_())

