Установить свойства виджета в 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
Перелет Санкт-Петербург - Сургут, авиакомпания UTair, Boeing 737-800. Три с половиной часа пролетели в полусне. Обслуживание фактически отсутствует.
Ииии... Аэропорт в Сургуте, переполненный с утра, с трудом вмещающий в себя путешественников.
И рейс в Белоярский через несколько часов.
#UTair
Boeing 737-800 авиакомпании UTair. Ничего нового, перелет в формате лоукост (т.е. практически без обслуживания). Вылет в 00-20, практически сразу провал в сон...
#UTair
Итак. Авиакомпания ЮТэйр. Рейс Москва (Внуково) - Дубай (Аль-Мактум).
Опытный Boeing 767, широкофюзеляжный самолет на 249 пассажиров.
Да-да, обычно все мы летаем ютами в Сургут, Нягань и Белоярский, но Дубай тоже сойдёт )))
А в Дубае будет транзит и пересадка на следующую авиакомпанию...
#UTair
✈️ 7700
📌B762 рейса UT716 «Дубай-Москва» подал сигнал бедствия
🔵Борт сжигал топливо и сделал более 10 зон ожидания
🔵За его полётом наблюдало около 50 тысяч человек, сделав аварийный рейс самым просматриваемым в мире
⬅️На данный момент самолёт приземлился в аэропорту вылета
Лёгкое небо
#aviation#news#UTair
Вдогонку за рассветом летим в Белоярский!
Турбовинтовой ATR 72-500, ловко жужжа пропеллерами, летит из Сургута за солнцем и теплом. Минус 20.
И лучший город Земли.
#Белоярский#ХМАО
#UTair
Люди и техника работают на пределе возможностей. Подобного по масштабу поиска в Красноярском крае ещё не было.
Семью Усольцевых ищут.
Каждый день — новая попытка, новый маршрут. Заканчиваются ресурсы, устают люди... Добровольцев отряда «ЛизаАлерт» держит надежда и двигают вперёд ваши неравнодушие и помощь.
Для авиации погода нелётная, но БПЛА могут подняться. Сегодня с добровольцем отряда из Москвы доставлены на место поиска три беспилотника с запасом аккумуляторов. БПЛА, надёжные, устойчивые к экстремальным условиям, уже обследуют территорию.
На земле продолжают отработку задач пешие группы и проходимая техника; работают кинологи ГУФСИН, сотрудники полиции и Следственного комитета, курсанты ВИИ СФУ. Привлечены спелеологи и альпинисты. Надёжный тыл добровольцам обеспечивает Красноярское отделение Российского Красного Креста. Плечом к плечу с нами многие дни территорию обследуют добровольцы ПСГ «Сибирь», объединения «Азимут», КРОО СПР «Поиск пропавших детей им. О. Василишиной».
Протяжённость треков за все дни поиска — более 4000 км.
Мы благодарны каждому, кто помог: присоединился к поиску, передал оборудование, доставил к месту поисково-спасательных работ людей и технику.
Благодаря авиакомпании UTair на поиск были доставлены 3 БВС с дополнительными аккумуляторами. А программа лояльности #UtairStatus позволяет нам доставлять специалистов на место поиска, как произошло и в этот раз.
Большое спасибо авиакомпании #UTair за проект #ПоделисьМилями с #ЛизаАлерт. Огромное спасибо всем, кто делится милями с добровольцами.
Если вы хотите помочь или обладаете информацией о местонахождении пропавших, пожалуйста, позвоните на горячую линию отряда «ЛизаАлерт»:
8-800-700-54-52 (бесплатно и круглосуточно) и 112.
#отчетопоиске#Усольцевы#ТудаГдеВасЖдут