Установить свойства виджета в 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
🌎 In the Himalayas, the snow leopard’s wide, fur-covered paws act like natural snowshoes, distributing weight and keeping it from sinking on deep mountain snow. ✨
#wildlife⚡#adaptation⚡#Himalayas
👉subscribe Interesting Planet
🌎 The larva of the Himalayan glacier midge survives temperatures as low as -17°C by producing special proteins that act like antifreeze, preventing ice crystals from damaging its tissues. This adaptation lets it thrive in some of the coldest, highest places on Earth. ✨
#insects⚡#adaptation⚡#Himalayas
👉subscribe Interesting Planet
🌍 The Himalayas are rising by about 5 millimeters each year as the Indian and Eurasian plates continue to collide. This ongoing uplift makes these mountains among the youngest and fastest-growing on Earth. ✨
#mountains⚡#Himalayas⚡#tectonics⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography🌍
🌎 Bar-headed geese cross the Himalayas during migration, flying at altitudes above 7,000 meters. These birds have special hemoglobin that helps them absorb oxygen efficiently in thin air. Their migration route includes nonstop flights of up to 1,600 kilometers. ✨
#migration⚡#birds⚡#Himalayas
👉subscribe Interesting Planet
👉more Channels
🌎 In the soaring skies of the Himalayas, the bar-headed goose migrates over Mount Everest, flying at altitudes above 8,000 meters—higher than any other bird. Special hemoglobin in their blood enables them to absorb oxygen efficiently in the thin air, making this epic journey possible each year. ✨
#migration⚡#birds⚡#Himalayas
👉subscribe Interesting Planet
🌎 Mount Everest's border runs exactly along the Nepal-China divide, making its summit shared by two countries. Hikers can reach the top from either side, but the official border marker is a small metal pole embedded in the ice at 8,848 meters—the highest international boundary on Earth. ✨
#borders⚡#geography⚡#Himalayas
👉subscribe Interesting Planet
👉more Channels
🌍 The Eastern Himalayas are a biodiversity hotspot with over 10,000 plant species, and nearly a quarter of them are found nowhere else, despite covering less than 2% of India’s total area. ✨
#biodiversity⚡#Himalayas⚡#ecology⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🌍 The Kalapani region is a small Himalayan area claimed by both India and Nepal. Its strategic location at the tri-junction with China makes it a unique hotspot of geopolitical geography. ✨
#borders⚡#dispute⚡#Himalayas⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🌎 High in the Himalayan valleys, the Himalayan blue poppy blooms with dazzling blue petals. Its color comes from unique pigments that protect it from intense ultraviolet sunlight found at high altitudes. ✨
#flowers⚡#adaptation⚡#Himalayas
👉subscribe Interesting Planet
🌍 In Himalayan valleys, local communities have revived ancient glacial water channels called "kuls" to guide meltwater for farming. These living systems adapt to changing ice and rainfall each year. ✨
#Himalayas⚡#adaptation⚡#irrigation⚡#geography⚡#nature⚡#earth
👉subscribe Amazing Geography
👉more Channels
🌎 The Himalayan honey bee builds its hives on high cliffs, crafting giant honeycombs and producing reddish honey with unique psychoactive properties prized by local tribes. ✨
#honeybee⚡#Himalayas⚡#nature
👉subscribe Interesting Planet
🌎 Some Himalayan glaciers are “surge glaciers,” moving up to 100 times faster than normal for short periods. These icy rivers can suddenly speed up, advancing kilometers in months instead of centuries—reshaping valleys with astonishing power. ✨
#glacier⚡#Himalayas⚡#earth
👉subscribe Interesting Planet