Установить свойства виджета в 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
【#本站公告#General #Spring Festival Activities】
🧧The 2023 mushroom cloud Chinese New Year event has started!🧧
==================================
🐰The Year of the Rabbit uses mushroom cloud to let you "🐰Rabbit Fly Forward 🐰Rabbit to Run" all the way 💰
==================================
🌟This limited-edition special product, annual payment special discount 366CNY, let you go smoothly 💰💰💰
Limited to 10, sold out will not make up~
Preferential Specifications:
Time: 365 days
Level: big mushroom
Traffic: 888G (can be reset every 45 days)
Broadband: Peak 888Mbps
==================================
🌟All station product discount code:
Monthly payment: 15% off 2023-CNY-MON
Quarterly payment: 2023-CNY-SEA 25% off
Annual payment: 2023-CNY-YEA 35% discountG
================================
‼️ Notes for this Spring Festival event
1. All discounts are limited to new purchases (old packages cannot be used)
2. None of the refunds are supported
3. In case of exploiting loopholes or violating TOS (including behaviors suspected of loopholes), we have the right to refuse to provide you with services, or even ban your account. This site reserves the highest right of interpretation.
Event schedule: 2022/01/17 22:00-2023/02/01 00:00
==================================
Latest official website: https://1mgy.com
Contact customer support: https://t.me/mushroom_cloud_bot
--------------------------------------------------------------------
🧧2023 mushroom cloud 春節活動開跑囉!🧧
================================
🐰兔年使用 mushroom cloud 讓您 “🐰兔飛猛進 🐰兔來運轉” 一路發發發💰
================================
🌟本檔限量特惠产品,年缴 特惠366CNY,让您一顺顺利利💰💰💰
限量10,售完不補~
特惠規格:
时间:365day
等级: 大蘑菇
流量: 888G (每45天可人工重置一次)
宽带: 峰值888Mbps
================================
🌟全站產品優惠碼:
月繳: 2023-CNY-MON 8.5折
季繳: 2023-CNY-SEA 7.5折
年繳: 2023-CNY-YEA 6.5折
================================
‼️本檔春节活动注意事项
1. 所有優惠限新購(舊套餐無法使用)
2. 均不支持退款
3. 如有出現鑽漏洞或者違反TOS嘅行為(包含疑似漏洞嘅行為),我哋有權拒絕為您提供服務,甚至封禁賬號,本站保留最高解釋權。
活動檔期: 2022/01/17 22:00-2023/02/01 00:00
================================
最新官網: https://1mgy.com
聯繫客服: https://t.me/mushroom_cloud_bot
POCO M7 Plus, POCO M8s, REDMI 15 - China - OS3.0.302.0.WOUCNXM (Android 16)
📆2026/05/06 #release📱#spring
📥Recovery ROM
📝Changelog:
[System]
Updated the security patch to August 2025. Increased system security.
🔗@xiaomiui | @miui_download | @hyperosfirmware | MemeOS Updates | XimiTime