Установить свойства виджета в 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
🇲🇬🇷🇺 Deux avions Il-76 du ministère russe des Situations d'urgence ont acheminé une aide humanitaire à Madagascar, touché par le cyclone Gezani. C’est ce qu’a rapporté à TASS le service de presse du ministère.
#aide#cyclone#russie
🌍 In 2023, Cyclone Freddy became the longest-lasting tropical cyclone ever recorded, traveling over 12,000 kilometers and affecting countries from Madagascar to Mozambique with powerful winds and rain. ✨
#cyclone⚡#disaster⚡#weather⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography🌍
🌍 The highest recorded wind gust at ground level reached 408 km/h during Australia's 1996 Tropical Cyclone Olivia. This extreme burst shattered previous records for wind speed on Earth. ✨
#meteorology⚡#cyclone⚡#wind⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🇲🇬 Le gouvernement malgache a décrété "l’état de sinistre national" après le passage du cyclone Gezani, a rapporté le journal Madagascar Tribune.
D’après les dernières données du Bureau national de gestion des risques et des catastrophes (BNGRC), le cyclone a fait 36 morts, 374 blessés et 6 disparus. Au total, plus de 257.000 personnes ont été affectées par ses conséquences, et près de 9.000 Malgaches ont été contraints de quitter leur domicile. La ville de Toamasina, la deuxième du pays après la capitale et principal port, est la plus touchée: elle a été détruite à 80%.
#madagascar#cyclone#conséquences
🌍 In 2023, Cyclone Mocha became one of the strongest storms ever recorded in the North Indian Ocean, with winds over 250 km/h, causing severe flooding and reshaping coastal landscapes. ✨
#disaster⚡#cyclone⚡#flooding⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🇲🇬Au moins 20 personnes ont été tuées et 33 blessées par le cyclone tropical Gezani dans la ville de Toamasina, dans l'est de Madagascar. C'est ce qu'indique dans un communiqué le Bureau national de gestion des risques de catastrophes, obtenu par TASS.
Le décompte des victimes et l'évaluation des dégâts sont en cours. Les districts d'Atsinanana, d'Analamanga, d'Analanjirofo et d'Alaotra-Mangoro ont été les plus durement touchés.
La population de Madagascar avait été prévenue à l’avance de l’approche de Gezani, dont la vitesse du vent à l’épicentre atteint 250 km/h. Les cours dans les écoles ont été suspendus. La compagnie aérienne nationale Madagascar Airlines a annulé tous ses vols du 11 février.
#madagascar#cyclone#gezani
🇲🇬 Le cyclone tropical Gezani a frappé la côte orientale de Madagascar, selon un communiqué du Bureau national de la gestion des risques et catastrophes (BNGRC) du pays.
#madagascar#cyclone#gezani
🌍 In 2023, Cyclone Biparjoy spun over the Arabian Sea for nearly two weeks—a rare “very severe cyclonic storm” to last so long in this region, with winds impacting coasts over 1,000 kilometers apart. ✨
#cyclone⚡#disaster⚡#winds⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels