Установить свойства виджета в 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
🕵️#Vitalik continues selling $ETH.
In the past 2.5 days, he has sold 3,765 $ETH for $7.08M.
Since Feb 2nd, he has sold 10,723 $ETH for $21.74M at a price of $2,027.
Address: 0xfeb016d0d14ac0fa6d69199608b0776d007203b2
#ETH drop from the support zone might trigger -18% to -20% from the depicted zone, Keep an eye on!!📉
$ETH #ETHUSDT#Vitalik
https://x.com/CryptoBull_360/status/2025739068110487794?s=20
Vitalik Embraces New Milady NFT!
Vitalik Buterin has purchased a Milady NFT and updated his profile picture on X to showcase it. This marks another high-profile acquisition in the NFT space. Read more here.
#Vitalik#Milady#NFT#X#Crypto
📊
🔷⬇️🚨以太坊 基金會 再次出手!鏈上數據 顯示,基金會 近期持續 減持 $ETH 以補充營運資金。
#加密貨幣#區塊鏈#幣圈#以太幣
——— 📊市場情緒觀察 📊———
⚡️曝光新聞👇👇資源搜索群 🖲️👆
💰減持數據一覽:
• 出貨總量: 3,750 $ETH
• 變現總額: 830 萬美元
• 出場均價: $2,214
• 目前國庫餘額: 1,250 $ETH(價值約 277 萬美元)
💡重點分析:
1. 營運支出: 基金會通常在固定週期賣出 ETH 以支付全球開發者薪資及項目資助金(Grants),屬於預期內操作。
2. 逃頂大師再現? 社群始終高度關注 EF 的賣出時機。歷史上 EF 的減持點位常與市場階段性高位重合,本次 $2,214 是否具備參考價值值得深思。
3. 持倉縮減: 隨著國庫中 ETH 直接持倉降至低位,未來基金會可能更傾向於長期財務規劃。
📝原文摘要
The Ethereum Foundation continues to sell $ETH, having sold 3,750 $ETH for $8.3M at an average price of $2,214.
It still has 1,250 $ETH remaining, valued at $2.77M. link
#CryptoNews#Vitalik#行情#鏈上數據
🤣👇
☕️👇 幣圈 区块链新闻
😺👇
Major Unlockings Impacting Crypto Markets
🔑 Over $5M in large unlocks coming in 7 days, affecting tokens like APT, MOVE, and NEON. Total unlocking value surpasses $759M! For more details, visit Tokenomist.
🐦 Vitalik Buterin sells 340B DOG for 5.204 ETH (~$18.9K). Holding 8T DOG valued at ~$483K. Previous sales funded charity. More info here.
💬 Altman confident in AGI development this year.
📄 Buterin's new article on AI regulation, crypto's role in d/acc, and public financing. Read it here.
📈 Metaplanet aims to boost Bitcoin holdings to 10,000 BTC using loans and equity. Current holdings: 1,762 BTC. Full story here.
#Crypto#Unlocks#BTC#Vitalik#AGI#Memecoin#AI#Dogecoin#Altman#Investments#MarketTrends#MetaPlanet#BitcoinHoldings#ETH#MemecoinSales#Charity#PublicFinancing#AIRegulation#dacc#Tokenomist