如何在PySide中将关闭按钮放置在带有水平文本的垂直选项卡上?

时间:2019-02-06 19:34:31

标签: python tabs pyside

我正在尝试在应用程序的左侧创建一个垂直的标签栏,其中标签文本为水平。我找到了一个不错的gist用于创建此类“手指标签”。但是,我还需要能够关闭标签页,因此我希望每个标签页上都有关闭按钮。我尝试使用setTabsClosable成功将关闭按钮添加到选项卡,但将其放置在中间位置而不是右侧:finger tabs with badly positioned close buttons

是否可以使用水平文本在垂直选项卡上放置关闭按钮?似乎在PySide中只有QTabBar.LeftSide并且 QTabBar.RightSide,可以使用setTabButton进行设置。在这种情况下,这两个选项均无济于事。

我的代码(只是对forkthis gist进行了稍微的修改),例如:

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))

0 个答案:

没有答案