Установить свойства виджета в 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
El Real Madrid venció 3-0 al Cádiz el día de hoy y se proclamó campeón de La Liga EA sports
Por otro lado el Girona venció 4-2 al FC Barcelona y se lograron meter en la próxima edición de la UEFA Champions League por primera vez en su historia
Felicidades a los 2 clubes👏
@Fut_planet⚜️#RealMadrid🇪🇸#Girona🇪🇸#LaLiga🇪🇸
⚽️🇪🇸Liga
Girona 1-4 Barcelona#Liga#Girona#Barcelona
Cinco partidos, cinco victorias y las dos últimas con goleada incluida. Hay líder sólido en LaLiga y parece que para rato. Este Barça de Hansi Flick empieza a meter miedo a sus rivales con un juego muy bonito de ver en el que hay que destacar su mejoría en defensa, su pegada en ataque y una presión para recuperar balón que empieza recordar a la que le llevó a los títulos en la época de Messi.
https://www.marca.com/futbol/primera-division/cronica/2024/09/15/66e6b26122601d7d588b457f.html
🏆@Info288_deportes
⚽️🇪🇸Liga
Atlético 3-0 Girona#Liga#Atlético#Girona
Atlético de Madrid estrenó este domingo su casillero de victorias en LaLiga EA Sports 2024-2025 después de imponerse con autoridad por 3-0 al Girona FC en el Estadio Cívitas Metropolitano, un partido en el que los rojiblancos fueron superiores ante un rival un tanto inocente.
https://www.europapress.es/deportes/futbol-00162/noticia-atletico-brinda-noche-solida-metropolitano-20240825233757.html
🏆@Info288_deportes
⚽️🇪🇸Liga
Girona 2-1 Athletic#Liga#Girona#Athletic
Los mediodías de otoño con sol son de agradecer. Que se lo digan a Gazzaniga, que se fue del partido con tres penaltis detenidos a Berenguer, Iñaki Williams y Herrera. Pulido Santana pitó tres penaltis por recomendación del VAR, ya que no había visto ninguna de las acciones, que fueron sancionables a la vez que evitables. Tampoco estuvo fino para advertir que en el segundo Gazzaniga se adelantó y tuvo que repetirse. El argentino ni se inmutó. Si le tiran seis, los seguiría parando. En el otro área, a un paso del final, Padilla no pudo detener el lanzamiento de Stuani.
https://www.marca.com/futbol/primera-division/cronica/2024/10/06/67028ae0e2704e531e8b45a5.html
🏆@Info288_deportes
⚽️🇪🇸Liga
Girona 0-1 Real Sociedad#Liga#Girona#RealSociedad
La Real Sociedad volvió del parón con una buena victoria, firmada con un gol de Mikel Oyarzabal, en un partido en el que los txuriurdin pudieron haber marcado algún tanto más, pero tras no hacerlo terminaron sufriendo frente a un Girona que acusó las bajas.
https://www.marca.com/futbol/primera-division/cronica/2024/10/19/6713c6c5e2704e63b98b4592.html
🏆@Info288_deportes
⚽️🇪🇸 Liga
Valencia 2-0 Girona#Liga#Valencia#Girona
No importa lo profunda que sea la crisis o la salvajada que cometa Peter Lim, el Valencia siempre podrá contar con Mestalla para salir del agujero. El cuadro de Baraja ha sumado su primer triunfo del curso ante el Girona y ya no es el colista de Primera división. 13 partidos y 159 días ha necesitado el Valencia para volver a sumar de tres y volver a respirar tras un comienzo de Liga terrible que ha encendido todas la alarmas, pero no ha impedido que más de 40.000 fieles se citen en su coliseo para reanimar a su equipo.
https://www.marca.com/futbol/primera-division/cronica/2024/09/21/66ee7c6546163f58708b45a4.html
🏆@Info288_deportes
⚽️🇪🇸Liga
Getafe 0-1 Girona#Liga#Getafe#Girona
El Girona tumbó la muralla del Coliseum por primera vez esta temporada gracias a un gol de Yangel Herrera en la única ocasión de los de Míchel en un encuentro en el que los suyos tuvieron que jugar 'a otra cosa' y sufrir de lo lindo para llevarse la victoria. Los de Bordalás, de nuevo con problemas mayúsculos para general peligro real, siguen bordeando el descenso y se marchan muy tocados a la ventana de selecciones.
https://www.marca.com/futbol/primera-division/cronica/2024/11/10/6730df79268e3ee1418b4578.html
🏆@Info288_deportes