样式表的单个QTabBar项的自定义属性



我有一个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_())

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

实现这一点的唯一方法(除了完全覆盖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())

最新更新