Python 选项卡上的QTabWidget设置掩码(非选项卡内容)

Python 选项卡上的QTabWidget设置掩码(非选项卡内容),python,pyqt,pyqt5,mask,qtabwidget,Python,Pyqt,Pyqt5,Mask,Qtabwidget,我想使用setMask在QTabWidget上绕过选项卡的各个角落(而不是选项卡内容)。我试过: tabs=QTabWidget() 试探ABWidget=QRoundedTabWidget() tabs.addTab(小部件,“新选项卡”) #具有圆角和 #底部的倒转随机角 类QRoundedTabWidget(QWidget): def uuu init uuu(self,parent=None): 超级(QWidget,self)。\uuuuu初始化\uuuuuuuuuu(父级) 自半径

我想使用
setMask
QTabWidget
上绕过选项卡的各个角落(而不是选项卡内容)。我试过:

tabs=QTabWidget()
试探ABWidget=QRoundedTabWidget()
tabs.addTab(小部件,“新选项卡”)
#具有圆角和
#底部的倒转随机角
类QRoundedTabWidget(QWidget):
def uuu init uuu(self,parent=None):
超级(QWidget,self)。\uuuuu初始化\uuuuuuuuuu(父级)
自半径=3
self.tabHeight=32
self.setMask(self.roundEdges(self.rect()))
def圆边(自身、矩形):
self.tabWidth=InterClassVariables.resizeTabWidth
region=QRegion()
区域+=矩形。调整(自半径,0,-自半径,0)
区域+=矩形。调整(0,自半径,0,-自半径)
#左上角件
corner=QRect(rectangle.topLeft(),QSize(2*self.radius,2*self.radius))
区域+=区域(角点,区域椭圆)
#右上角件
corner.moveTopRight(rectangle.topRight())
区域+=区域(角点,区域椭圆)
返回区
但是,这会在选项卡的内容上设置掩码,而不是选项卡本身。我是否需要对
QTabWidget
对象进行子类化,以修改实际构建选项卡的
addTab
?我在哪里调用选项卡的子类小部件

编辑

这就是我目前得到的-选项卡内容的两个顶部角是圆角:

这是我想要的标签:


实际选项卡是一个QTabar。使用样式表和
边框半径
属性可以很容易地实现遮罩

class Template(QWidget):

    def __init__(self):
        super().__init__()
        tabs = QTabWidget()
        tabs.addTab(QWidget(), 'New Tab')
        vbox = QVBoxLayout(self)
        vbox.addWidget(tabs)
        self.setStyleSheet('''
        QTabBar::tab {
            background-color: #555;
            color: #fff;
            padding: 6px;
            border-top-left-radius: 6px;
            border-top-right-radius: 6px;
        }''')
文档中甚至有一个例子

关于倒转角,我不确定使用样式表是否可以实现,但也许您可以重新实现绘制事件
QPainterPath.quadTo()
将绘制二次贝塞尔曲线

class Tab(QWidget):

    def __init__(self, text, *args, **kwargs):
        super().__init__(*args, **kwargs)
        grid = QGridLayout(self)
        grid.addWidget(QLabel(text), 0, 0, Qt.AlignCenter)

    def paintEvent(self, event):
        qp = QPainter(self)
        qp.setRenderHint(QPainter.Antialiasing)
        qp.setPen(Qt.NoPen)
        qp.setBrush(QColor('#aaa'))

        w, h = self.width(), self.height()
        path = QPainterPath()
        path.moveTo(0, h)
        path.quadTo(w * 0.1, h, w * 0.1, h * 0.75)
        path.lineTo(w * 0.1, h * 0.25)
        path.quadTo(w * 0.1, 0, w * 0.2, 0)
        path.lineTo(w * 0.8, 0)
        path.quadTo(w * 0.9, 0, w * 0.9, h * 0.25)
        path.lineTo(w * 0.9, h * 0.75)
        path.quadTo(w * 0.9, h, w, h)
        qp.drawPath(path)
看起来是这样的:

编辑:现在要从中获得一个功能标签小部件,不幸的是,我认为你必须重新设计一下轮子。下面是一个简单的例子:

class Tab(QAbstractButton):

    def __init__(self, text, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setCheckable(True)
        grid = QGridLayout(self)
        grid.addWidget(QLabel(text), 0, 0, Qt.AlignCenter)

    def paintEvent(self, event):
        qp = QPainter(self)
        qp.setRenderHint(QPainter.Antialiasing)
        qp.setPen(Qt.NoPen)
        color = '#ccc' if self.isChecked() else '#aaa'
        qp.setBrush(QColor(color))

        w, h = self.width(), self.height()
        path = QPainterPath()
        path.moveTo(0, h)
        path.quadTo(w * 0.1, h, w * 0.1, h * 0.75)
        path.lineTo(w * 0.1, h * 0.25)
        path.quadTo(w * 0.1, 0, w * 0.2, 0)
        path.lineTo(w * 0.8, 0)
        path.quadTo(w * 0.9, 0, w * 0.9, h * 0.25)
        path.lineTo(w * 0.9, h * 0.75)
        path.quadTo(w * 0.9, h, w, h)
        qp.drawPath(path)


class TabWidget(QWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.hbox = QHBoxLayout()
        self.hbox.setSpacing(0)
        self.qbg = QButtonGroup(self)
        self.tabs = []
        self.stacked_widget = QStackedWidget()
        vbox = QVBoxLayout(self)
        vbox.setSpacing(0)
        vbox.addLayout(self.hbox)
        vbox.addWidget(self.stacked_widget)
        self.setStyleSheet('''
        QStackedWidget {
            background-color: #ccc;
            border-radius: 4px;
        }''')

    def addTab(self, widget, text):
        self.stacked_widget.addWidget(widget)
        tab = Tab(text)
        tab.clicked.connect(self.setCurrentTab)
        self.tabs.append(tab)
        self.hbox.addWidget(tab)
        self.qbg.addButton(tab)

    def setCurrentTab(self):
        i = self.tabs.index(self.sender())
        self.stacked_widget.setCurrentIndex(i)


class Template(QWidget):

    def __init__(self):
        super().__init__()
        tabs = TabWidget()
        tabs.addTab(Widget(), 'Tab 1') 
        tabs.addTab(Widget(), 'Tab 2')
        vbox = QVBoxLayout(self)
        vbox.addWidget(tabs)

提供一张图片,同时显示您得到的和想要得到的图片。谢谢,这很有效。在使用样式表的旁注中,您知道有没有一种方法可以将反向边界半径添加到选项卡的下角,以实现类似于Google Chrome的外观?再次感谢。@SamG101我不知道如何使用样式表,但我用另一种方式编辑了这篇文章,你可以看到它的样子。太棒了,谢谢!最后一件事,我如何将
选项卡(Qwidget)
添加到选项卡栏中,而不是添加普通的
Qwidget
?Thanks@SamG101我添加了一个例子,它需要重新创建TabWidget,并从QabStretcButton子类化选项卡。如果它回答了您的问题,请批准。非常感谢,它非常完美