QTabWidget在选项卡上设置掩码(不是选项卡内容)

时间:2020-02-22 16:56:05

标签: python pyqt pyqt5 mask qtabwidget

我想使用QTabWidgetsetMask上绕制制表符的角(而不是制表符的内容)。我尝试过:

tabs = QTabWidget()
tempTabWidget = QRoundedTabWidget()
tabs.addTab(tempTabWidget,"New Tab")
#Tab widget that has rounded corners and
#inverted random corners at the bottom
class QRoundedTabWidget(QWidget):
  def __init__(self,parent=None):
    super(QWidget,self).__init__(parent)
    self.radius = 3
    self.tabHeight = 32
    self.setMask(self.roundEdges(self.rect()))

  def roundEdges(self,rectangle):
    self.tabWidth = InterClassVariables.resizeTabWidth

    region = QRegion()
    region += rectangle.adjusted(self.radius,0,-self.radius,0)
    region += rectangle.adjusted(0,self.radius,0,-self.radius)

    #Top left corner piece
    corner = QRect(rectangle.topLeft(),QSize(2 * self.radius,2 * self.radius))
    region += QRegion(corner,QRegion.Ellipse)

    #Top right corner piece
    corner.moveTopRight(rectangle.topRight())
    region += QRegion(corner,QRegion.Ellipse)

    return region

但是,这会在选项卡的内容(而不是选项卡本身)上放置一个掩码。我是否需要继承QTabWidget对象的子类来修改addTab的实际构建选项卡的位置?该标签的子类窗口小部件在哪里调用?

编辑

这是我当前得到的-选项卡内容的两个上角是四舍五入的: Content of tab has mask applied

这是我在标签上想要的:

enter image description here

1 个答案:

答案 0 :(得分:2)

实际选项卡是QTabBar。您可以使用样式表和<form action="/environments" method="POST"></form> <select name="name"> <% environments.forEach(function(environment){ %> <option value="<%= environment.name %>"><%= environment.name %></option> <% }); %> </select> <select name="region"> <% environments.forEach(function(environment){ %> <option value="<%= environment.region %>"><%= environment.region %></option> <% }); %> </select> <input type="submit" /> </form> 属性来轻松实现此目的,以实现蒙版。

border-radius

文档here中甚至有一个示例。

关于倒角,我不确定样式表是否可以实现,但是也许您可以重新实现paint事件。 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()

看起来像这样:

enter image description here

编辑:不幸的是,现在要获得功能性的标签小部件,我认为您必须重新发明一下轮子。这是一个最小的示例:

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)

enter image description here

相关问题