Propriété personnalisée sur chaque QTabBar élément de feuille de style

0

La question

J'ai un QTabWidget et je veux une propriété sur les différents onglets qui détient si l'onglet est persistante ou non (similaire aux onglets dans VSCode, où si vous ne double-cliquez sur un fichier, il ne sera pas persister dans l'éditeur)

J'ai jusqu'à présent. Je veux que la TabItem's avec _persistent=False pour être en italique et les autres à être en caractères normaux.

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_())


pyqt pyside2 python qtabwidget
2021-11-21 07:09:49
1

La meilleure réponse

0

Feuille de Style pseudo-sélecteurs ne prennent pas en charge la propriété des sélecteurs, car les propriétés sont définies pour le widget, alors que les pseudo-sélecteurs sont des éléments de ce widget.

Le seul moyen de le réaliser (d'ailleurs complètement substitution de la paintEvent() de la QTabBar) est par l'intermédiaire d'un QProxyStyle, et par la mise en œuvre de drawControl.

Le truc est de trouver quel onglet de l'option en cours rect appartient, et, finalement, vérifiez la propriété de cet onglet pour définir la police.

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())
2021-11-21 09:00:02

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................