Установить свойства виджета в PySide можно не только через соответствующие методы и конструктор класса. Можно их изменять с помощью метода setProperty по имени.
btn = QPushButton("Click Me")
btn.setProperty("flat", True)
Это аналогично вызову
btn.setFlat(True)
Если указать несуществующее свойство, то оно просто создается
btn.setProperty("btnType", "super")
Получить его значение можно методом .property(name)
btn_type = btn.property("btnType")
Когда это может быть полезно?
▫️Можно просто хранить какие то данные в виджете и потом их доставать обратно
widget = QWidget()
widget.setProperty('my_data', 123)
print(widget.property('my_data'))
▫️ Назначая эти свойства разным виджетам можно потом отличить виджеты во время итераци по ним. Например, найти все кнопки со свойством my_data="superbtn".
Но ведь вместо кастомного свойства можно использовать objectName, будет тот же результат.
Да, но y ObjectName есть ограничение - только строки.
▫️ Если нам потребуется не просто поиск а, например, сортировка по числу, то свойства позволяют нам это сделать. Поддерживается любой тип данных
widget.setProperty('my_data', {'Key': 'value'})
widget.setProperty('order', 1)
all_widgets.sort(key=w: w.property('order'))
Но ведь Python позволяет всё вышеперечисленное сделать простым созданием атрибута у объекта
widget.order = 1
widget.my_data = 123
Да, но я думаю что не надо объяснять почему не стоит так делать. К тому же, если у виджета нет свойства то метод .property(name) вернет None, а отсутствующий атрибут выбросит исключение.
▫️ Действительно полезное применение кастомным свойствам - контроль стилей. Здесь атрибутами не обойтись, нужны именно свойства.
Дело в том, что в селекторах стилей можно указывать конкретные свойства виджетов на которые следует назначать стиль.
Просто запустите этот код
from PySide2.QtWidgets import *
if __name__ == "__main__":
app = QApplication([])
widget = QWidget(minimumWidth=300)
layout = QVBoxLayout(widget)
btn1 = QPushButton("Action 1")
btn2 = QPushButton("Action 2")
btn3 = QPushButton("Action 3", flat=True)
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
# добавим кастомное свойство одной кнопке
btn1.setProperty("btnType", "super")
# добавляем стили
widget.setStyleSheet(
"""
QPushButton[btnType="super"] {
background-color: yellow;
color: red;
}
QPushButton[flat="true"] {
color: yellow;
}
"""
)
widget.show()
app.exec_()
С помощью селектора мы избирательно назначили стили на конкретные кнопки.
Как получить список всех кастомный свойств?
Функция получения списка кастомных свойств отличается от получения дефолтных.
def print_widget_dyn_properties(widget):
for prop_name in widget.dynamicPropertyNames():
property_name = prop_name.data().decode()
property_value = widget.property(property_name)
print(f"{property_name}: {property_value}")
#tricks#qt
👌 B.K.Licht - Lámpara LED de techo con luz indirecta, plana, luz blanca neutra, IP44, panel, lámpara LED, lámpara de techo, lámpara de baño, lámpara de salón, lámpara de cocina, 98 x 20 x 3 cm, negro
💬#Amazon#Prime#Iluminacion
✅OFERTA: 25.99 €🔥🔥🔥
❌ Antes: 39.99 €
💶 Amazon: tly.es/lan-Awb
👁️ Visto en @savemoney_es
👌 KARE Design lámpara de pie Nature Straight, Estilo casa de Campo, lámpara de salón, lámpara para Dormitorio, Bombilla no incluida, 171x52x52cm
💬#Amazon#Prime#Iluminacion
✅OFERTA: 321.6 €🔥🔥🔥
❌ Antes: 689 €
💶 Amazon: tly.es/GxcWEwl
👁️ Visto en @savemoney_es
👌 B.K.Licht - Lámpara LED de techo con luz indirecta, plana, luz blanca neutra, IP44, panel, lámpara LED, lámpara de techo, lámpara de baño, lámpara de salón, lámpara de cocina, 98 x 20 x 3 cm, negro
💬#Amazon#Prime#Iluminacion
✅OFERTA: 25.99 €🔥🔥🔥
❌ Antes: 39.99 €
💶 Amazon: tly.es/lan-Awb
👁️ Visto en @savemoney_es
👌 BRILONER - Sistema de carriles Luxtrail set de prolongación, 2x LED spots, extensible, orientable, lámparas, sistema de carriles techo, carril proyector, 1m, negro
💬#Amazon#Prime#Iluminacion
✅OFERTA: 29.67 €🔥🔥🔥
💶 Amazon: tly.es/X8OXa7f
👁️ Visto en @savemoney_es
Tipos de LED: 7 consejos para escoger la bombilla perfecta para tu casa
La tecnología LED es mucho más eficiente para la iluminación de lo que eran las bombillas incandescentes, pero también son más versátiles. Esta mejora de las prestaciones en las bombillas hace que tengamos muchas más opciones entre las que elegir...
Leer más#iluminacion#led
💥Lámpara Reality R1107-03 Leuchten
Ilumina tu hogar con estilo esta Navidad
✅OFERTA: 75.85€
❌ Antes: 138.48€
💰Ahorras un 45%🔥
Ambienta tus espacios con luz cálida y elegante
👉 Descubre cómo transformar tu casa
#iluminacion#lamparas#decoracionhogar#ofertas#hogar#navidad
🛰️Oferta publicada en Moda y Belleza
💥Bombilla LED Mate Philips Eficiente
Ilumina tu hogar con calidez navideña
✅OFERTA: 5.37€
❌ Antes: 8.66€
💰Ahorras un 38%🔥
Ahorra energía y disfruta de una luz cálida y acogedora
👉 Haz brillar tu hogar esta Navidad
#philips#bombillaled#iluminacion#eficienciaenergetica#hogar#luzcalida#navidad#ofertas
🛰️Oferta publicada en Hogar