自定义属性

算定义属性 用于和qss 联合控制样式

from typing import Any, Callable
from PySide6.QtWidgets import QWidget


class prp:
    def __init__(
        self, objname: bool = False, lsn: Callable[[QWidget, object], Any] | None = None
    ) -> None:
        self.stn = objname
        self.lsn = lsn

    def __set_name__(self, cls: type[QWidget], name):
        self.name = name

    def __get__(self, obj: QWidget, b):
        if self.stn:
            return obj.objectName()
        else:
            return obj.property(self.name)

    def __set__(self, obj: QWidget, v):
        oo = self.__get__(obj, None)

        if self.stn:
            obj.setObjectName(v)

        else:
            obj.setProperty(self.name, v)
        if self.lsn:
            self.lsn(obj, v)
        if oo != v and not obj.isHidden():
            st = obj.style()
            st.unpolish(obj)
            st.polish(obj)


if __name__ == "__main__":

    sty = """
    QPushButton{
        background-color: green;
    }
    QPushButton[even=true]{
        border:3px solid blue;
    }
    QPushButton[even=false]{
        border:3px solid red;
    }

    #test_btn{
        background-color: pink;
    }
    [state=test]{
        background-color: yellow;
    }
    [state=test_black]{
        background-color: black;
    }
    #test_btn[state=test]{
        background-color: red;
    }
    #test_btn[state2=test]{
        border:2px solid black;
    }
    """
    from PySide6.QtWidgets import QPushButton, QHBoxLayout, QVBoxLayout, QApplication

    class pp(QPushButton):

        state = prp()

        obj = prp(True)

        def __radd__(self, o: QHBoxLayout | QVBoxLayout):
            o.addWidget(self)
            return o

        def __mul__(self, o: str):
            self.obj = o
            return self

        def __add__(self, o: str):
            self.state = o
            return self

        def on_even(self: QWidget, v):
            print(v)

        even = prp(lsn=on_even)

    app = QApplication()
    app.setStyleSheet(sty)
    mm = QWidget()
    mm.setLayout(mly := QVBoxLayout())

    class dt:
        ct = 0

    for i in [
        pp("base:                   green "),
        pp("named:                  pink  ") * "test_btn",
        pp("stated:                 yellow") + "test",
        pp("named + stated:         red   ") * "test_btn" + "test",
        pp("named + error state:    pink  ") * "test_btn" + "test_black",
        spp := pp("click "),
    ]:
        mly += i

    def on_click():
        ee = dt.ct % 2
        if ee == 0:
            spp.even = True
        else:
            spp.even = False
        dt.ct += 1

    spp.clicked.connect(on_click)
    mm.show()
    app.exec()

posted @ 2026-01-15 12:24  方头狮  阅读(4)  评论(0)    收藏  举报