Установить свойства виджета в 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
La vida no se rige por la voluntad o por la intención. La vida es una cuestión de nervios, de fibras, de células lentamente formadas, en las que se esconde el pensamiento, y la pasión tiene sus sueños. Puede que ahora te creas a salvo y te consideres fuerte. Pero un casual tono de color en una habitación, un cielo matinal, un perfume peculiar que hayas amado y que te trae sutiles recuerdos consigo, un verso de un poema olvidado que vuelve a tu memo- ria, una cadencia de una pieza musical que has dejado de tocar, de todo esto, Dorian, te lo digo, de todas estas cosas parecen depender nuestras vidas...
El retrato de Dorian Gray
#OscarWilde
Si usted me conoce basado en lo que yo era hace un año, usted ya no me conoce. Mi evolución es constante. Permitame presentarme de nuevo...
#OscarWilde
“¡Sí, soy un soñador! Y estoy orgulloso de ello, porque es gracias a mi ensoñación que puedo encontrar mi camino en completa oscuridad y luego ver el amanecer antes que el resto de la humanidad”.
#OscarWilde
Así que aprovecha tu juventud antes de que se acabe. No desperdicies tus días dorados escuchando a santos aburridos, no trates de corregir lo incorregible, no entregues tu vida a los ignorantes, vulgares y nulos, siguiendo las falsas ideas y aspiraciones malsanas de nuestra época. ¡Vivir! Vive la maravillosa vida que se esconde dentro de ti. ¡No te pierdas nada, busca siempre nuevas sensaciones! ¡No tengas miedo de nada!
El retrato de Dorian Gray
#OscarWilde