Установить свойства виджета в 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
Des opérateurs de drones russes ont neutralisé un canon de défense aérienne KS-19, plusieurs automobiles et un blindé des forces ukrainiennes près de Gouliaïpolé, dans la région de Zaporojié.
#russie#ukraine#frappes
🇷🇺🇺🇦 Des saboteurs des forces armées ukrainiennes ont été neutralisés à Dimitrov lors d'une tentative de contourner les positions russes, a rapporté le Service fédéral de sécurité (FSB) de la République populaire de Donetsk (RPD).
#russie#ukraine#frappes
L'armée russe a perturbé le réapprovisionnement des forces ukrainiennes dans la direction de Konstantinovka en détruisant un véhicule blindé ennemi.
#russie#ukraine#frappes
🇮🇱🇮🇷 L’armée israélienne a annoncé une nouvelle série de frappes menées contre l’Iran.
Selon un communiqué du service de presse de l’armée israélienne, l’armée de l’air a mené dans la nuit de nouvelles frappes contre des cibles en Iran, notamment des sites de production d’armes et de missiles balistiques à Téhéran.
#israël#iran#frappes
🇮🇱🇮🇷 L'Armée de défense d’Israël (Tsahal) annonce avoir frappé plus de 200 cibles dans l'ouest et le centre de l'Iran en une journée.
Au total, 20 raids de grande envergure ont été menés en 23 heures mobilisant des dizaines de chasseurs israéliens. Parmi les cibles visées figurent des lanceurs de missiles, des systèmes de défense antiaérienne et des usines d'armement.
#israël#iran#frappes
🇮🇷🇮🇱🇺🇸Une personne est morte et 28 ont été blessées après une frappe des États-Unis et d’Israël dans le centre de Téhéran. C’est ce que rapportent les autorités de la capitale iranienne.
Dans le quartier de Dastgib à la suite de l’agression de l’ennemi américano-sioniste, pour l’instant, une personne est morte et 28 ont été blessées,
selon les autorités, citées par la radio-télévision publique.
#iran#frappes#bilan
🇱🇧🇮🇱 La situation actuelle à Beyrouth.
L’armée israélienne a mené plus de 20 frappes contre le Liban la nuit dernière, a rapporté la chaîne de télévision libanaise Al Mayadeen.
#liban#israël#frappes
🇮🇱🇱🇧Le président libanais a condamné la destruction par Israël des infrastructures civiles et des installations vitales.
Auparavant, le ministre de la Défense d’Israël a indiqué que Tsahal avait reçu l’ordre de détruire les ponts sur le fleuve Litani pour contrer le Hezbollah.
#liban#israël#frappes
🇮🇱🇱🇧L'armée israélienne a lancé une nouvelle vague de frappes sur la banlieue sud de Beyrouth, a déclaré une source au sein de la Défense civile.
#israël#liban#frappes