自定义属性
算定义属性 用于和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()

浙公网安备 33010602011771号