Установить свойства виджета в 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
Вчера на мой пост в тг-канале "Активист Шувалов" дал ссылку агрегатор новостей #BRIEF. Как итог 1,9К просмотров и несколько десятков репостов.
В посте показано: не смотря на то, что юристы #КПРФ впряглись за Удальцова (за это можно быть только благодарными), подавляющее большинство ресурсов КПРФ:
- либо вообще ничего не написали о задержании Удальцова и доставлении его в Следственный комитет на допрос,
- либо предоставили сухую информацию без политической оценки.
Это было очень странно!
Вчера вечером и сегодня утром ситуация начала принципиально меняться: с жёстким видео в защиту Удальцова выступил Бондаренко, а также депутат ГосДумы Олег Михайлов. Также некоторые, кто обошёл тему молчанием, дали в своих соцсетях "сухую информацию".
Свободу Удальцову!
Смотрим Бондаренко.
https://t.me/nbondarenko_blog/2266
Лучший бриф от клиента по мнению Роба Кэмбэлла (главный по стратегии в агентстве BBDO Colenso)
Объединяя пост про правильную постановку задачи и пост про бренд Virgin, история про бриф от Ричарда Брэнсона.
Задачу на разработку лаундж зоны Virgin Atlantics в аэропорту Брэнсон поставит так: ‘Make people want to miss their plane’
(сделайте так, чтобы пассажиры захотели пропустить свой самолёт)
#brief#virgin
@planning_horizon
DEPO - #INFOGRAPHICS
Over-the-month brief overview on key depository indicators assembled by the Central Securities Depository, as well as on stock exchange and OTC trading results.
#brief#depo#infographics#statistics#changes#stockexchange#trades
deponet.uz|Tg|Fb|Inst|Youtube
DEPO - #INFOGRAPHICS
Over-the-month brief overview on key depository indicators assembled by the Central Securities Depository, as well as on stock exchange and OTC trading results.
#brief#depo#infographics#statistics#changes#stockexchange#trades
deponet.uz|Tg|Fb|Inst|Youtube
DEPO - #INFOGRAPHICS
Over-the-month brief overview on key depository indicators assembled by the Central Securities Depository, as well as on stock exchange and OTC trading results.
#brief#depo#infographics#statistics#changes#stockexchange#trades
deponet.uz|Tg|Fb|Inst|Youtube
☄️Телеграмм. Франция. Дуров
WTF?!?
Ну что тут сказать?!
🗣Мы говорим, что в нашей стране много чего нельзя, долго обсуждаем признание BRIEF иноагентом, различные центры признаются экстримистскими, но...
⚖️...в России, после введения закона об иноагентах, ими признаны 569 организаций или физических лиц. В Великобритании только в 2024 году — 440!
Почувствуй разницу, что называется.
‼️Что же касается ареста Павла Дурова, как гражданина России и гражданина мира — то это беззаконие с моральной точки зрения, но вполне укладывается в правовую систему любого государства. Такое же, как и с Джулианом Ассанжем! Вопрос только как себя государство — поборник справедливости, демократии и свободы слова позиционирует.
Пятая Республика 🇫🇷 не перестает удивлять!
🚫Свобода слова в мире, как и само понятие демократия давно уже перестали соответствовать своим значениям!
...Я чувствую: не принимает тебя чужая земля
— В.В. Жириновский
#лдпр
#FreeDurov
#FREEPAPA
#жириновский
#ввж
#телеграм
#telegram
#BRIEF
#WikiLeaks
Александр Фомин – подписаться