Установить свойства виджета в 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
#Sinfonía8#Haydn#ChristopherHogwood
Título:La Sinfonía n.º 8 en sol mayor
Autor:Franz Joseph Haydn
Movimientos:
🎵 00:00 I. Allegro molto, 3/8
🎵 05:27 II . Andante en do mayor, 2/4
🎵 16:53 III. Menuetto y Trio, 3/4
🎵 21:45 IV. La tempesta: Presto, 6/8
Interpretación:
La Academia de Música Antigua.
Director:
Christopher Hogwood
Fuente:🎼
@ClasicaAlAtardecer
#Sinfonía8#Haydn#ChristopherHogwood
LA SINFONÍA N.º 8 EN SOL MAYOR
La Sinfonía n.º 8 en sol mayor, Hoboken I/8, del compositor austríaco Joseph Haydn es la tercera sinfonía escrita tras haberse unido a la corte de los Esterházy en 1761, en la transición entre el Barroco y el Clasicismo. Es la tercera de la trilogía de sinfonías, que se llaman Le matin (n.º 6.), Le midi (n.º 7) y Le soir (n.º 8).
La orquestación de la sinfonía n.º 8 es muy similar a la de un concerto grosso del barroco, donde un pequeño grupo de instrumentos solistas destaca sobre todo el conjunto. En la sinfonía n.º 8, el grupo de solistas consta de un violonchelo y dos violines y el grupo mayor contiene dos oboes, una flauta, dos trompa, cuerdas, fagot y clavecín. El uso que Haydn hace del fagot y del clavecín recuerda al bajo continuo empleado continuamente durante el Barroco; sin embargo no lo usa en toda la obra.
Esta sinfonía tiene el número de movimientos que será habitual en las sinfonías clásicas (en la tónica de sol mayor a no ser que se indique otra cosa):
🎵I. Allegro molto, 3/8
🎵 II . Andante en do mayor, 2/4
🎵 III. Menuetto y Trio, 3/4
🎵 IV. La tempesta: Presto, 6/8
El primer movimiento es una Giga (danza) en la forma sonata y emplea una melodía de una canción de la ópera de Gluck Le diable à quatre llamada "Je n’aimais pas le tabac beaucoup (No me gustó mucho el tabaco)”. El último movimiento, también en forma sonata, subtitulado La tempesta, intenta mostrar la sensación de una tormenta.
En el primer movimiento, las cuerdas empiezan con una melodía principal de ocho compases, un tema que se repite durante todo el movimiento. Haydn hace uso del formato del concerto grosso en el segundo movimiento, con la melodía en el concertino, los dos violines y el violonchelo solistas. La melodía del minueto es bastante simple, con el fagot y las cuerdas llevando el tema en el trío. En el movimiento final, La tempesta (la tormenta), las cuerdas tienen varias figuras descendentes que sugieren la lluvia al caer, y saltos de octava en el violín se usan para crear tensión.
Hay una interesante anécdota sobre el tema de la flauta en este movimiento: cuando Haydn describe una tormenta en el último movimiento del oratorio Las estaciones, usa el mismo tema como en este movimiento, con la misma orquestación: un pasaje en la flauta con arpegios descendentes.
@ClasicaAlAtardecer