【问题标题】:Custom property on individual QTabBar item for stylesheet样式表的单个 QTabBar 项上的自定义属性
【发布时间】:2021-12-31 06:33:48
【问题描述】:

我有一个QTabWidget,我希望在各个选项卡上都有一个属性来保存选项卡是否持久(类似于 VSCode 中的选项卡,如果您不双击文件,它将不会持久在编辑器中)

到目前为止我有这个。我希望TabItem 和_persistent=False 使用斜体,而其他使用普通字体。

from PySide2 import QtWidgets, QtCore, QtGui


class TabItem(QtWidgets.QWidget):
    def __init__(self, persistent=False):
        super(TabItem, self).__init__()
        self._persistent = persistent
        self.setProperty('persistent', '0' if not persistent else '1')


class TabWidget(QtWidgets.QTabWidget):
    def __init__(self):
        super(TabWidget, self).__init__()

        item1 = TabItem(persistent=False)
        item2 = TabItem(persistent=True)

        self.addTab(item1, 'FirstItem')
        self.addTab(item2, 'SecondItem')

        self.setStyleSheet("""
            QTabBar::tab{
                font: normal;
            }
            QTabBar::tab[persistent="0"]{
                font: italic;
            }
        """)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = TabWidget()
    win.show()
    sys.exit(app.exec_())


【问题讨论】:

    标签: python pyqt pyside2 qtabwidget


    【解决方案1】:

    样式表伪选择器不支持属性选择器,因为属性是为 widget 设置的,而伪选择器是该小部件的 元素。

    实现这一点的唯一方法(除了完全覆盖 QTabBar 的paintEvent())是通过QProxyStyle 和实现drawControl。

    诀窍是找到当前选项rect属于哪个选项卡,并最终检查该选项卡的属性以设置字体。

    class TabStyle(QtWidgets.QProxyStyle):
        def drawControl(self, ctl, opt, qp, widget=None):
            if ctl == self.CE_TabBarTabLabel:
                for i in range(widget.count()):
                    tabRect = widget.tabRect(i)
                    if tabRect == opt.rect:
                        tabWidget = widget.parent()
                        try:
                            if tabWidget.widget(i)._persistent:
                                qp.save()
                                font = qp.font()
                                font.setItalic(True)
                                qp.setFont(font)
                                super().drawControl(ctl, opt, qp, widget)
                                qp.restore()
                                return
                        except:
                            pass
            super().drawControl(ctl, opt, qp, widget)
    
    # ...
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle(TabStyle())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2018-05-08
      • 2011-12-12
      • 2019-06-30
      相关资源
      最近更新 更多