Установить свойства виджета в 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
🇷🇺🇷🇺🎉Les 8 et 9 mai, un cessez-le-feu est proclamé en l'honneur de la célébration de la #Victoire du peuple soviétique lors de la Grande Guerre patriotique, a annoncé le ministère russe de la Défense.
Les Forces armées russes prendront toutes les mesures nécessaires pour assurer la sécurité des événements festifs. À la suite de cette proclamation de cessez-le-feu, la Russie espère que la partie ukrainienne suivra son exemple, a indiqué le ministère.
RT en français • Osez questionner !
🇷🇺La première répétition générale du défilé de la #Victoire du 9 mai s'est déroulée le 21 avril à Saint-Pétersbourg
RT en français • Osez questionner !
🟢Claude Janvier, écrivain polémiste et analyste politique, fait le point sur la trêve à l'occasion du Jour de la #Victoire.
RT en français • Osez questionner !
🎗Le « Régiment des immortels » dans les stades de football russes a débuté le 6 mai à l’occasion du derby de Coupe entre Spartak et CSKA
Les joueurs, entraîneurs et arbitres sont entrés sur le terrain en brandissant des portraits de leurs proches ayant participé à la Grande Guerre patriotique.
En l'honneur du 81e anniversaire de la #Victoire, l'Union russe de football et le mouvement du Régiment des immortels de Russie, avec le soutien de la Première ligue russe et de la Ligue nationale de football, organisent un programme de commémorations intitulé « Un pour tous : Équipe, Patrie, Victoire ! »
Le coup d’envoi symbolique a été donné par Rem Balakirev, 98 ans, qui a participé aux combats pour la prise de Berlin.
RT en français • Osez questionner !
🎗Le musée de la #Victoire organise son traditionnel grand événement patriotique : « la valse de la Victoire ».
Cet événement est consacré à la célébration du Jour de la Victoire et vise à préserver la mémoire de la Grande Guerre patriotique. Des centaines de participants de tous âges ont pris part à la danse.
RT en français • Osez questionner !
🇷🇺🇷🇺 Les 8 et 9 mai, un cessez-le-feu est proclamé en l'honneur de la célébration de la #Victoire du peuple soviétique lors de la Grande Guerre patriotique, a annoncé le ministère russe de la Défense.
Les Forces armées russes prendront toutes les mesures nécessaires pour assurer la sécurité des événements festifs. À la suite de cette proclamation de cessez-le-feu, la Russie espère que la partie ukrainienne suivra son exemple, a indiqué le ministère.
RT en français • Osez questionner !
📆🥇 Piotr Tolstoï, vice-président de la Douma, s’est rendu sur la Place Rouge avec ses enfants pour qu'ils n'oublient jamais la #Victoire.
RT en français • Osez questionner !
⭐#Russie : des militaires rendent hommage aux vétérans avant le Jour de la #Victoire
Dans le territoire d’Altaï, des militaires russes ont rendu hommage aux vétérans à l’approche du Jour de la Victoire. Accompagnés par un orchestre militaire, des soldats ont défilé devant les habitations d’anciens combattants avec des copies des drapeaux historiques de l’Armée rouge.
L’orchestre a ensuite interprété la chanson russe « Jour de la Victoire » ainsi que d’autres compositions emblématiques de l’époque soviétique.
RT en français • Osez questionner !
🎗🗣Vladimir #Poutine présente ses vœux aux dirigeants et aux peuples de pays étrangers à l’occasion du 81e anniversaire de la #Victoire.
Le président russe a adressé des messages aux dirigeants de l’Azerbaïdjan, de l’Arménie, de la Biélorussie, du Kazakhstan, du Kirghizstan, du Tadjikistan, du Turkménistan, de l’Ouzbékistan, de l’Abkhazie et de l’Ossétie du Sud, ainsi qu’aux peuples de la Géorgie et de la Moldavie.
RT en français • Osez questionner !
🎗#Moscou se prépare pour le 9 Mai
Moscou se prépare à célébrer le 9 Mai – une date sacrée pour des millions de personnes à travers le monde. Mais cette année, cette Fête de la #Victoire se déroule sous haute tension. Menaces de Kiev, silence des Européens et attaques de drones : les autorités russes ont mis en garde le pouvoir ukrainien. Pour en savoir plus, les explications de notre reporter Igor Kourachenko, depuis le centre de la capitale russe.
RT en français • Osez questionner !
Le patriarche Cyrille de #Moscou a célébré une liturgie à la cathédrale des forces armées russes, à l’approche du Jour de la #Victoire.
RT en français • Osez questionner !