自定义 属性 样式表的单个 QTabBar 项目
Custom property on individual QTabBar item for stylesheet
我有一个 QTabWidget
并且我想要在各个选项卡上有一个 属性 来保存选项卡是否持久(类似于 VSCode 中的选项卡,如果您不要双击一个文件,它不会保留在编辑器中)
到目前为止我已经有了这个。我希望带有 _persistent=False
的 TabItem
为斜体,而其他为普通字体。
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_())
样式 sheet 伪选择器不支持 属性 选择器,因为属性是为 小部件 设置的,而伪选择器是 [=20=该小部件的 ] 元素。
实现这一点的唯一方法(除了完全覆盖 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())
我有一个 QTabWidget
并且我想要在各个选项卡上有一个 属性 来保存选项卡是否持久(类似于 VSCode 中的选项卡,如果您不要双击一个文件,它不会保留在编辑器中)
到目前为止我已经有了这个。我希望带有 _persistent=False
的 TabItem
为斜体,而其他为普通字体。
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_())
样式 sheet 伪选择器不支持 属性 选择器,因为属性是为 小部件 设置的,而伪选择器是 [=20=该小部件的 ] 元素。
实现这一点的唯一方法(除了完全覆盖 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())