Установить свойства виджета в 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
FTX/Alameda unstake 197,637 $SOL, valued at 17.07M.
https://solscan.io/account/H4yiPhdSsmSMJTznXzmZvdqWuhxDRzzkoQMEWXZ6agFZ#transfers
https://x.com/OnchainLens/status/2031919069579132969
Follow @onchainlens for more onchain updates
FTX/Alameda unstaked 196,611 $SOL, valued at $15.97M.
https://solscan.io/account/H4yiPhdSsmSMJTznXzmZvdqWuhxDRzzkoQMEWXZ6agFZ#transfers
https://x.com/OnchainLens/status/2021521751658881497
Follow @OnchainLens for more Onchain Updates
FTX/Alameda unstaked 195,669 $SOL, valued at $27.98M.
https://solscan.io/account/HoBeML5zvsmNGn5fXXKADEdSKK9G7qSBFxVFwoRQsyMx#transfers
https://x.com/OnchainLens/status/2010864084745584724
Follow @OnchainLens for more Onchain Updates
A whale deposited 51,750 $SOL worth $4.75M into #Binance after being dormant for 7 months, realizing a loss of $4.37M
The whale initially withdrew 50,000 $SOL for $9.12M and sent it for staking.
https://solscan.io/account/HnsXQEWHrHQQa8E3ok1D1EkmK9Muwmt8C14urBhc9iyq#transfers
https://x.com/OnchainLens/status/2036701947693240644
Follow @onchainlens for more onchain updates
A whale withdrew 48,744 $SOL, worth $6.15M, from #OKX and sent it for staking.
In total, the whale has withdrawn and staked 1,231,861 $SOL ($186.09M) since August 22, 2025. Currently, these $SOL are valued at $155.68M, resulting in a loss of $30.4M.
https://solscan.io/account/GcJFx1MZJ8Zn7PwtRprnzrXz4NyApdm16yAkCFQ4JvG#transfers
https://x.com/OnchainLens/status/2002256392284221914
Follow @onchainlens for more onchain updates
A whale withdrew 100,000 $SOL worth $9.93M from #Bybit and sent it for staking after 2 months.
https://solscan.io/account/9bcNtnFMBgRuiXq2jF5XG8CVGzqfBCpm1sMrBPTEuboq#transfers
https://x.com/OnchainLens/status/2018845766056550470
Follow @OnchainLens for more Onchain Updates.
In the past 24 hours, a whale has unstaked 170K $SOL ($14.85M) and deposited it into #Kraken.
The whale still has 457,937 $SOL ($38.9M) staked.
https://solscan.io/account/7VMTVroogF6GhVunnUWF9hX8JiXqPHiZoG3VKAe64Ckt#transfers
https://x.com/OnchainLens/status/2037469340887593046
Follow @onchainlens for more onchain updates
A wallet linked to the Pump.fun team or investor deposited 2.34B $PUMP worth $4M into #Bitget.
https://solscan.io/account/5v7ZZg1D1si417WhUQF9Br2dRQEnd1sTbCfesscUCVKE#transfers
https://x.com/OnchainLens/status/2041552240666915231
Follow @onchainlens for more onchain updates
A wallet linked to the Pump.fun team deposited 1.757B $PUMP worth $3.54M into #Bitget.
The wallet still holds 12.3B $PUMP ($24.77M).
https://solscan.io/account/5v7ZZg1D1si417WhUQF9Br2dRQEnd1sTbCfesscUCVKE#transfers
https://x.com/OnchainLens/status/2029719672535544181
Follow @onchainlens for more onchain updates
After 5 months of dormancy, a whale withdrew 50,000 $SOL ($4.25M) from #Binance and #Bybit, then sent it for staking.
https://solscan.io/account/8iZyywnZu1yBPPNkQLgpPZyBtuzGG9rjNLGggKaGozXD#transfers
https://x.com/OnchainLens/status/2025436744360096170
Follow @onchainlens for more onchain updates
Trump Meme Team Allocation Wallet sent 5.267M $TRUMP, worth $22.44M, into a #BitGo Custody wallet. Are we selling via OTC? https://solscan.io/account/AduisyNJFAxo49tDQmJUN7Ujc2xAmgmfjJqTaPptPUU4#transfers https://x.com/OnchainLens/status/2018495068852871321…
Trump Meme Team Allocation Wallet sent 5.267M $TRUMP, worth $22.44M, into a #BitGo Custody wallet.
Are we selling via OTC?
https://solscan.io/account/AduisyNJFAxo49tDQmJUN7Ujc2xAmgmfjJqTaPptPUU4#transfers
https://x.com/OnchainLens/status/2018495068852871321
Follow @onchainlens for more onchain updates