Установить свойства виджета в 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
🎙 INVEST REPORT Injex Finance - The 1inch of Injective 🔥🥷
⚖️ INVEST REPORT project rating 9/10 ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️
It is the final day of Round 1 in $INJX Presale, and this is your moment to act before the price jumps.
Join Presale: https://sale.injex.fi/
Don’t let this chance slip through your fingers! Secure your $INJX tokens now at the most favorable price. Join the future of decentralized finance on the Injective chain.
Act now, join the presale.
https://sale.injex.fi/
#INJ#Presale
#PoshCoin#Presale
Public Presale Started NOW!
ℹ️ Info About PoshCoin: PoshCoin is a new crypto token that will revolutionize the digital economy – mainly selling and purchasing goods in the cannabis sector.
PreSale Link:https://www.pinksale.finance/launchpad/0xD90267576273A0d640850De1beFdF366744C13DB?chain=BSC
⚜️ Token Information
🔶Token Name: Poshcoin
🔶 Symbol: PSCN
🔶Type: BEP-20
🔶 Minimum Buy: 0.0035BNB
🔶 Maximum Buy: 35BNB
🌐 Useful links :
Telegram Channel Platform: https://t.me/PoshCoinPSCN
Telegram platform group: https://t.me/poshcoin_pscn
JOIN PRESALE NOW!
Disclaimer: Please do your own research before joining to any project.
#MetaCubez#Presale
A Metaverse Full of Possibilities
✔️ Licenced From Singapore and UAE
✔️ Audited Smart Contract
✔️ KYC Team
✔️ 30% Burnt
✔️ 60% Locked
✔️ Professional team from all around the world
MetaCubez Pre-Sale is Live Now!🔥🔥
https://linktr.ee/MetaCubez
Check out there Social Links
Channel | Community | Website | Instagram | Discord | Twitter
🚨🚀 Exciting news for all crypto enthusiasts! 🌟🤑
🚨🚀 25% of DLX tokens will be available for pre-sale on Pinksale Finance from April 25-30, 2023. This is a rare opportunity to invest in one of the hottest tokens on the market! #PinksaleFinance#presale💰💸💎
Hey all you crypto enthusiasts! We've got some awesome news to share - the pre-sale for DLX tokens on Pinksale Finance is starting soon! From April 25-30, 2023, 25% of the total DLX token supply will be available for purchase. Don't miss out on this chance to invest in one of the hottest tokens on the market! #PinksaleFinance#presale💰💸💎
🔥👇 Web site Dollex Network
https://dollox.network/
‼️Note: We are airdrop hunters and only participate in free airdrops, please do not send any fee for receiving airdrop tokens.
🚨🚀 Exciting news for all crypto enthusiasts! 🌟🤑
🚨🚀 25% of DLX tokens will be available for pre-sale on Pinksale Finance from April 25-30, 2023. This is a rare opportunity to invest in one of the hottest tokens on the market! #PinksaleFinance#presale💰💸💎
Hey all you crypto enthusiasts! We've got some awesome news to share - the pre-sale for DLX tokens on Pinksale Finance is starting soon! From April 25-30, 2023, 25% of the total DLX token supply will be available for purchase. Don't miss out on this chance to invest in one of the hottest tokens on the market! #PinksaleFinance#presale💰💸💎
🔥👇 Web site Dollex Network
https://dollox.network/
‼️Note: We are airdrop hunters and only participate in free airdrops, please do not send any fee for receiving airdrop tokens.
💎 MetaGram Presale — Early Investors’ Edge!
Be among the first to secure $MGR before listing at $0.0519.
⚡️ Buy & Earn instantly with our new swap-style UI:
0.001 BNB → 50 $MGR (free airdrop)
0.01 BNB → 500 $MGR
🤝 Referrals: +50% $MGR & +50% BNB back
🔥 Early entry = maximum upside. Don’t wait until the price goes public.
👉metagram.digital
#MetaGram#Presale#BNB#Crypto
💎 MetaGram Presale — Early Investors’ Edge!
Be among the first to secure $MGR before listing at $0.0519.
⚡️ Buy & Earn instantly with our new swap-style UI:
0.001 BNB → 50 $MGR (free airdrop)
0.01 BNB → 500 $MGR
🤝 Referrals: +50% $MGR & +50% BNB back
🔥 Early entry = maximum upside. Don’t wait until the price goes public.
👉metagram.digital
#MetaGram#Presale#BNB#Crypto