Установить свойства виджета в 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
🇺🇸 Un homme âgé de 69 ans a tué par balle ses partenaires d’affaires au Texas, selon ABC.
Le tireur a ouvert le feu lors d’une réunion dans un centre commercial de la ville de Carrollton, faisant un mort et trois blessés. Plus tard, l’homme a abattu une autre personne dans son appartement.
#étatsunis#fusillade#victimes
🇺🇸 Au moins douze personnes ont été blessées dans une fusillade dimanche près du lac Arcadia dans l'Oklahoma, aux États-Unis, a rapporté la chaîne CBS News.
La chaîne KWTV-DT a indiqué plus tôt que la police avait trouvé quatre personnes présentant des blessures par balle à l’intérieur d’un véhicule.
#étatsunis#fusillade#victimes
🇺🇸 Des images de la fusillade à Virginia Beach.
Les faits se sont produits dans une rue après une altercation verbale entre deux groupes de jeunes. Au moins huit personnes ont été blessées, rapporte la chaîne ABC.
#étatsunis#fusillade#victimes
🇺🇸 Au moins douze personnes ont été blessées dans une fusillade dimanche près du lac Arcadia dans l'Oklahoma, aux États-Unis, a rapporté la chaîne CBS News.
Neuf blessés ont été transportés dans un centre médical de la capitale de l’État et trois autres vers un hôpital d’Edmond, ont précisé des responsables médicaux à la chaîne.
La chaîne KWTV-DT a indiqué plus tôt que la police avait trouvé quatre personnes présentant des blessures par balle à l’intérieur d’un véhicule.
Vidéo: Luke Brenner/X
#étatsunis#fusillade#victimes
🇹🇷 Une fusillade est survenue dans une école dans le sud-est de la Turquie, le tireur a été neutralisé, a rapporté la chaîne de télévision NTV. Quatre personnes ont été tuées, selon les autorités.
#turquie#fusillade#victimes
🇹🇷 Seize personnes ont été blessées lors d'une fusillade dans un établissement scolaire en Turquie, rapporte la chaîne de télévision TGRT.
L'assaillant a ouvert le feu de manière aléatoire dans la cour intérieure. Il a ensuite fait irruption dans le bâtiment, où il a continué à tirer. Certains élèves ont quitté l’établissement en sautant par les fenêtres.
L'assaillant, né en 2007, est décédé au cours de l'opération de police, a annoncé le gouverneur de la province de Sanliurfa, Hasan Sildak.
#turquie#fusillade#victimes
🇺🇦 La police nationale ukrainienne va mener une enquête administrative après que deux policiers ont fui les lieux d'une fusillade à Kiev, laissant des civils sans protection, a déclaré le ministre de l'Intérieur du pays, Igor Klimenko.
J'ai chargé le chef de la police nationale ukrainienne, Ivan Vygovski, de mener une enquête administrative sur les actions des policiers lors de l'attentat terroriste à Kiev et de fournir toutes les informations au Bureau d'enquête d'État,
a écrit M. Klimenko sur sa chaîne Telegram.
#ukraine#police#fusillade
🇧🇷 Un adolescent de treize ans a ouvert le feu dans une école située dans le nord-ouest du Brésil. Deux employés sont morts, plusieurs élèves ont été blessés, selon le site G1.
#brésil#fusillade#victimes
🇲🇽 Le nombre de blessés lors de la fusillade survenue sur le site archéologique de Teotihuacan, au Mexique, est passé à 13 personnes, a fait savoir le cabinet de sécurité mexicain.
#mexique#fusillade#victimes
🇷🇺Un étudiant a ouvert le feu dans le hall d'un établissement scolaire à Anapa. Il a été interpellé. Le bilan fait état d'un mort et de deux blessés, selon la chaîne Telegram de la Direction principale du ministère de l'Intérieur pour le territoire de Krasnodar.
D'après les premiers éléments, un étudiant de cet établissement a ouvert le feu aujourd'hui dans le hall d'un institut professionnel d'Anapa avec une arme non identifiée. Une personne est morte, deux personnes ont été blessées et reçoivent des soins. L'auteur présumé a été interpellé,
indique le communiqué.
#russie#fusillade#anapa
🇹🇭Un jeune homme a ouvert le feu dans une école dans le sud de la Thaïlande et a blessé plusieurs personnes, a rapporté le journal Khaosod.
Selon l’édition, le drame s'est produit dans la ville de Hat Yai, dans la province de Songkhla. La fusillade a fait des blessés, mais le nombre exact de victimes n'est pas connu. Selon les informations préliminaires, le suspect s'est introduit dans l'école peu avant la fin des cours et a pris en otage plus de 300 élèves et enseignants. Il est signalé que le tireur a 18 ans. Il a été interpellé.
#thaïlande#fusillade#bilan
🇺🇸 Un inconnu a ouvert le feu dans un centre commercial de l'État américain de Louisiane, rapporte Newsweek. Tout le monde a été évacué et aucun blessé n'est à déplorer.
#étatsunis#fusillade#louisiane