Как расположить кнопку закрытия на вертикальных вкладках с горизонтальным текстом в PySide? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать вертикальную панель вкладок в левой части моего приложения, где текст вкладки расположен горизонтально.Я нашел хороший gist для создания таких «вкладок пальца».Однако мне также нужно иметь возможность закрывать вкладки, поэтому я хотел бы иметь кнопки закрытия на каждой вкладке.Я попытался использовать setTabsClosable, который успешно добавил кнопки закрытия на вкладки, но разместил их в центре вместо правой стороны: finger tabs with badly positioned close buttons

Есть ли способ позиционирования закрытиякнопка на вертикальной вкладке с горизонтальным текстом?Кажется, что в PySide есть только QTabBar.LeftSide и QTabBar.RightSide, которые можно установить с помощью setTabButton.Ни один из вариантов не поможет в этом случае.

Мой код (только слегка измененный fork из этой сущности ) для примера:

Example.py:

from PyQt4 import QtGui, QtCore
from FingerTabs import FingerTabWidget, FingerTabBarWidget

import sys

app = QtGui.QApplication(sys.argv)
tabs = QtGui.QTabWidget()
tabBar = FingerTabBarWidget(width=100,height=25)
tabs.setTabBar(tabBar)
digits = ['Thumb','Pointer','Rude','Ring','Pinky']
for i,d in enumerate(digits):
    widget =  QtGui.QLabel("Area #%s <br> %s Finger"% (i,d))
    tabs.addTab(widget, d)
tabs.setTabPosition(QtGui.QTabWidget.West)
tabs.tabCloseRequested.connect(tabs.removeTab)
tabs.show()
sys.exit(app.exec_())

FingerTabs.py:

# Updated so a PyQT4 Designer TabWidget can be promoted to a FingerTabWidget

from PyQt4 import QtGui, QtCore

class FingerTabBarWidget(QtGui.QTabBar):
    def __init__(self, parent=None, *args, **kwargs):
        self.tabSize = QtCore.QSize(kwargs.pop('width',100), kwargs.pop('height',25))
        QtGui.QTabBar.__init__(self, parent, *args, **kwargs)
        self.setTabsClosable(True)

    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        option = QtGui.QStyleOptionTab()

        for index in range(self.count()):
            self.initStyleOption(option, index)
            tabRect = self.tabRect(index)
            tabRect.moveLeft(10)
            painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, option)
            painter.drawText(tabRect, QtCore.Qt.AlignVCenter |\
                             QtCore.Qt.TextDontClip, \
                             self.tabText(index));
        painter.end()
    def tabSizeHint(self,index):
        return self.tabSize

# Shamelessly stolen from this thread:
#   http://www.riverbankcomputing.com/pipermail/pyqt/2005-December/011724.html
class FingerTabWidget(QtGui.QTabWidget):
    """A QTabWidget equivalent which uses our FingerTabBarWidget"""
    def __init__(self, parent, *args):
        QtGui.QTabWidget.__init__(self, parent, *args)
        self.setTabBar(FingerTabBarWidget(self))
...