Установить свойства виджета в 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
🔤🔤🔤🔤🔤🔤🔤2️⃣0️⃣2️⃣5️⃣
TON Fest 2025 is a 2-day immersive festival like no other. Dive into the world of #TON, take part in thrilling games, and compete for massive rewards. TON Society will be the Ecosystem Partner of this groundbreaking event!
Why you can’t miss it:
⭐️ Explore $TON like never before.
⭐️ Win incredible prizes and rewards.
⭐️ Join a community shaping the future of Web3.
⭐️ Exclusive giveaways for participants.
➡️️Tickets are available now.Be there, or miss out on the event everyone will be talking about! 💎
⭐️You will need Telegram Stars to buy a festival ticket and upgrade $MANA mining. 🚀
#TONFest#Web3
🔤🔤🔤🔤🔤🔤🔤2️⃣0️⃣2️⃣5️⃣
TON Fest 2025 is a 2-day immersive festival like no other. Dive into the world of #TON, take part in thrilling games, and compete for massive rewards. TON Society will be the Ecosystem Partner of this groundbreaking event!
Why you can’t miss it:
⭐️ Explore $TON like never before.
⭐️ Win incredible prizes and rewards.
⭐️ Join a community shaping the future of Web3.
⭐️ Exclusive giveaways for participants.
➡️️Tickets are available now.Be there, or miss out on the event everyone will be talking about! 💎
⭐️You will need Telegram Stars to buy a festival ticket and upgrade $MANA mining. 🚀
#TONFest#Web3
🚀 TON Fest Season 1 heats up with HoldCoin🎉
💥Win 6 Million Diamonds & $TON
🔥The longer you “hold”, the more you are rewarded
📆Sept 3-Sept 8, 4 AM UTC
👉HoldCoin mini app
Open SafePal App QuestHub to join the campaign now!
📱DL App: http://safepal.com/download
📚Learn more campaign detail
#SFP#TonFest#HoldCoin
Festival season with Ton Festival and CapsGame!
Our friends from ❤️CapsGame and
🔠TON Festival decided to join forces and launch a new season! A festive atmosphere, fresh activities, and, of course, a bunch of surprises — all this is already here!
What's ahead?
⚫️6 Cool Chips for Your Collection
⚫️ Huge edition — 20,000 chips
⚫️ Leaderboards and festival activities right in the game!
How to Earn you Tent Points 🏕
⚫️ Completing dailies: 10
⚫️ Mint of any chip: 50
⚫️ Chip Madness Round Completion: 5 (no repeats)
⚫️ Upgrade your chips to Legend+ and higher — the cooler the chip, the more points!
🏅Prize fund — tickets🎫 giving cool bonuses and exclusive items await those who collect the most points at the end of the season.
🗓️The final day of the event is March 27. The store opens on March 28th — exchange tickets for cool prizes!
🫶Become a part of the main event of the year!
#CapsGame#TONFest#Web3#TON
Bidask Protocol — New DEX on TONand a Giveaway💵33,000
🅱️Bidask launched in mainnet just a few days ago — before that, the exchange was in the testnet for almost three months. The team claims that their swap model is faster, cheaper and more efficient than its analogues. Practice confirms: exchanges are instantaneous, and the 10-15 sec delay is just the time it takes for the wallet to pick up the transaction. Further optimization is already on the TonCore side.
💰The seed investor is DWF Labs (market maker and validator #TON). For a young project, this is a serious resource — #DWF is building its own ecosystem and strengthening the platforms it is a part of.
#Bidask — partner 🌑#TONFest. The festival will feature a raffle 💵 33,000, and you only need to complete three tasks:
✔️Make $10 swaps
✔️Provide $10 to liquidity pools
✔️Provide $20 to liquidity pools (first $10 does not count). Your $20 is locked in the pool until June 30, 2025.
We recommend the $TON/$USDT pairand be sure to follow the buttons inside TON Fest — otherwise the quest will not be counted.
Bidask DEX | Channel
MyTonWallet v3.7 Update & $MY Birthday
💎 Overview of new features and changes:
🔵Expanded TON DNS support: You can now renew multiple domains at once, track their expiration, and link them to your wallet directly inside MTW.
🔵Mass transfers: Send up to 255 transactions at once — including via CSV file uploads.
🔵All token actions in one place: Long-press any token to open a contextual menu with all available options.
🔵Pin NFT collections: Access your favorite collections directly from the home screen — especially handy for Telegram gifts.
🔵USDe staking now live
🎉Happy 1st Birthday to $MY! On June 2nd, it’s been exactly 1️⃣ year since the community voted to launch the $MY utility token. The team shared a yearly recap and highlighted key milestones in #MyTonWallet’s journey.
🎁 To celebrate, all users holding at least 500 $MY can enjoy zero aggregator swap fees inside #MTW from June 2 to June 9! (Blockchain fees still apply.)
#MY#Update#TonFest
🌑TON Fest Extended Through May 28 — you still have time to complete quests and claim rewards from top Web3 Projects!
TON Fest is an immersive virtual world built with Telegram Mini Apps. Complete tasks, join activities, and earn on-chain rewards you won’t find anywhere else.
🎟Grab your ticket to unlock access to VIP zones, premieres, challenges, and exclusive prize pools!
#TON#Web3#Quest#TMA#VR#TONFest