Personalizate de proprietate asupra individuale QTabBar element de stil

0

Problema

Am o QTabWidget si eu vreau o proprietate pe filele individuale, care deține dacă fila este persistentă sau nu (similar cu filele în VSCode, unde, dacă nu faceți dublu clic pe un fișier, acesta nu va persista în editor)

Am până acum. Vreau TabItemmodelului cu _persistent=False pentru a fi în italic și pe alții să fie în font normal.

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

Cel mai bun răspuns

0

Foaie de stil pseudo selectoare nu suport proprietate selectoare, pentru că proprietățile sunt stabilite pentru widget, în timp ce pseudo selectorii sunt elemente de care widget.

Singura modalitate de a obține că (în afară de complet imperative paintEvent() de QTabBar) se face printr-o QProxyStyle, și de punere în aplicare drawControl.

Trucul este de a găsi fila care opțiunea curentă rect aparține, și în cele din urmă a verifica proprietatea că tab-ul pentru a seta fontul.

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

În alte limbi

Această pagină este în alte limbi

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