Установить свойства виджета в 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
🟩Let's Share $150,000 in ZETA! zetablockchain
🎯Ready for an immersive experience with #ZetaChain Testnet before the mainnet launch and a chance for potential airdrops?
JOIN NOW 👉https://tp-lab.tptool.pro/tokenpocket-christmas/?locale=en#/ Galxe 👉https://galxe.com/TokenPocket/campaign/GCc28ttYTk
With such incredible projects, the anticipation for the #ZetaChain mainnet is booming! zetaswapdex LENX_Finance zkme_ UltiverseDAO SushiSwap ChatGM_Official CharacterXAI sugar_datingfi eddy_protocol TokenPocket_TP
【Details】https://twitter.com/TokenPocket_TP/status/1746790100393206137
【Powered By】Crypto Box
🆕 ZetaChain Testnet is Now Live on TokenPocket! zetablockchain
▶️Supported by TokenPocket Mobile Wallet and Chrome Extension Wallet!
TokenPocket now supports users to
✅ Custom add #ZetaChain Testnet to TokenPocket.
✅ Create & Import #ZetaChain wallets.
✅ Interact with #ZetaChain Testnet-based DApps.
🚀 Create your first #ZetaChain wallet on TokenPocket_TP!
Use Guide👉https://help.tokenpocket.pro/en/wallet-operation/how-to-create-a-wallet/zetachain-testnet
👉https://www.tokenpocket.pro/
👉https://extension.tokenpocket.pro/#/
【Details】https://twitter.com/TokenPocket_TP/status/1704418412582338967
【Powered By】Crypto Box
🆕#ZetaChain is now live on TokenPocket_TP. zetablockchain
💚ZetaChain is a simple, fast, and secure Omnichain Blockchain.
🚀How to create/import a #ZetaChain wallet on #TokenPocket Mobile Wallet and Chrome Extension Wallet?
Guide👉https://help.tokenpocket.pro/en/wallet-operation/how-to-create-a-wallet/zetachain
Download #TokenPocket
👉https://www.tokenpocket.pro/
👉https://extension.tokenpocket.pro/
#ZetaChain#TokenPocket $ZETA
【Details】https://twitter.com/TokenPocket_TP/status/1752905240133996845
【Powered By】Crypto Box
💥@zetablockchain Ecosystem is booming!!
💚You won't want to miss a chance to share 1,000 #ZETA, right? Dive into👇
https://galxe.com/TokenPocket/campaign/GCEZRtwWpG
🎯How to create & import a #ZetaChain wallet on TokenPocket_TP?
Full guide👇
(For mobile and Chrome extension users.)
【Details】https://twitter.com/TokenPocket_TP/status/1753242729960628260
【Powered By】Crypto Box
💥We’re excited to announce that #TokenPocketChristmas winners can claim rewards at
@ZetaBlockchain
mainnet launch! #ZetaChain
Check if you are on the first-round winner list
👉https://docs.google.com/spreadsheets/d/1zqZx0BHE0gVBn8doFhRAdFBaQrwoxzPbwu2CYCOkvhs/edit#gid=0
How to claim your #ZETA?
1️⃣Download TokenPocket Wallet
👉https://tokenpocket.pro
👉https://extension.tokenpocket.pro
2️⃣Create/import/sync your #ZetaChain wallet on TokenPocket after mainnet launch!
3️⃣Share the news with your friends if you are on the winner list! (RT, Like, Comment) 👉https://twitter.com/TokenPocket_TP/status/1752147092942749951
When to get your ZETA?
⏰The rewards will be distributed at the same time of #ZetaChain airdrop claim opens this week.
All participating user data from #TokenPocket are also whitelisted to get a boost in the first XP campaign on ZetaHub. Learn more about the 10% of the total ZETA token supply for community rewards: https://twitter.com/zetablockchain/status/1750758520637804707
AI Agent Launchpad Goes Live
Zearn launches the world’s first Universal AI Agent launchpad using autonomous AI on ZetaChain’s infrastructure. Users can create meme narratives and deploy AI agents in just three clicks, leveraging real-time social sentiment for refinement. Read more here.
Additionally, Utah's Bitcoin reserve bill has passed the Senate Revenue and Taxation Committee, marking a significant step for cryptocurrency regulation in the state.
#AI#Crypto#Zearn#ZetaChain#Bitcoin#Blockchain#Utah#Innovation
Quoted TokenPocket_TP : 💥All the #TokenPocketChristmas rewards have been distributed to winners' TokenPocket #ZetaChain Wallet!! #HODL
To celebrate the #ZetaChain Mainnet launched, TokenPocket provides 1,000 #ZETA to #TokenPocket users!
Dive into👇
https://galxe.com/TokenPocket/campaign/GCEZRtwWpG#ZetaChain
😁Eligible for TokenPocket users, please create/import a #ZetaChain wallet on #TokenPocket Mobile Wallet and Chrome Extension Wallet?
Guide👉https://help.tokenpocket.pro/en/wallet-operation/how-to-create-a-wallet/zetachain
【Details】https://twitter.com/TokenPocket_TP/status/1752914758746210773
【Powered By】Crypto Box