Установить свойства виджета в 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
🔥$CAT
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating. #TSLA
Telegram: https://t.me/theoriginalcatcoin
X: https://x.com/itscatcoin?s=21
Website: https://bitcointalk.org/index.php?topic=441402.msg4849923#msg4849923
🔗 Contract: https://solscan.io/token/4vncMi4j819n9ndBZXwVXaVHPN8oTgebtEPWcaEipump
https://dexscreener.com/solana/Cctnuj42QAx9CXuG2HWxab1tiVrwMkwkgReoLDC9Y3qv
$CAT #SOLANA#TESLACALLS
🔥$RAY
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating.
X: https://x.com/i/communities/2033099708164378981
Website: https://x.com/bbcworld/status/2033099192877429170?s=46
🔗 Contract: https://solscan.io/token/G7ydggVFm4RVTTsd3E8MWh7angBs78MTmZN3gVZPpump
https://dexscreener.com/solana/HAVxMaLK96qgiyRdvX4YVpjfajU49zWot4tdjxPesMrg
#RAY#SOLANA#TESLACALLS
🔥$PEEP
Pepe is tired of the dips. With $PEEP, he finally found his inner peace. Pepe enjoys the continuous rise and profits that come with this coin. No more red candles, just Endless Pumps.
Telegram: https://t.me/PepeEnjoysEndlessPump
X: https://x.com/i/communities/2033273028843638853
Website: https://pepeenjoysendlesspump.fun/
🔗 Contract: https://solscan.io/token/8HeSKdX9XkJB9PBZiXhFuTYaWbfn3u6sftyPbAcxpump
https://dexscreener.com/solana/3N7BHVKWTvzehC1MxsRcmHRAg9vX6fuZj1JFD2zFPiQk
#PEEP#SOLANA#TESLACALLS
🔥 $BAGWORKOOR
Entered this position as a speculative play within the SOLANA ecosystem. Monitor pullbacks carefully, manage entries with discipline, and always conduct your own due diligence before participating.
X: https://x.com/i/communities/2033254050209153139
🔗 Contract: https://solscan.io/token/FDQ77aHDgV6ozbv1b4WM5oXuHGV1cMnjSXpxvgSzpump
https://dexscreener.com/solana/ED41PwcJhsPgbUHQb4LZJbWzFXtcEC6RAherWC2YgEU3
#BAGWORKOOR#SOLANA#TESLACALLS
🔥$AGENTJAK
An AI-powered Web3 project built around autonomous agents, combining blockchain and intelligent automation to create smarter tools for the crypto ecosystem. 🚀
Telegram: https://t.me/agentwojak
X: https://x.com/agentjak_?s=21
Website: https://agentjak.xyz/
🔗 Contract: https://solscan.io/token/GKyTdLZG7BXjwWUW3QFwz7UykZE9wGXU9bKYDLdbpump
https://dexscreener.com/solana/363sZVoQVmwTbZ5LhCZperw7HJBoTK3dWT8Bqy8rMTqY
#AGENTJAK#SOLANA#TESLACALLS
🔥$GOMU
A meme-powered token inspired by Gomu Gator, bringing fun, viral energy, and a strong community to the Solana ecosystem. Built for memes, momentum, and the next wave of degen culture. 🚀
Telegram: https://t.me/+pTID8PQmyps5ZGRl
X: https://x.com/gomugator?s=21
Website: https://www.gomugator.com/
🔗 Contract: https://solscan.io/token/Bx74hpFiaiBbSonrjyqxjGfAA7gRxM2CeKiy31uN6biR
https://dexscreener.com/solana/2h282gdoEDejWWtXTMfPxvMDVPqKb7rVf24b2gWS1cg4
#GOMU#SOLANA#TESLACALLS
🔥$NOTGAY
A pure meme-driven token built around internet culture and community momentum. Simple narrative, strong meme energy, and a growing degen community pushing the movement forward. 🚀
Telegram: https://t.me/notgaymeme
X: https://x.com/notgaymeme?s=21
Website: https://notgaysool.framer.website/
🔗 Contract: https://solscan.io/token/uphcYhzNzLBQQcQdpsbQXTFSNApMuh1Y4Jp6KTYpump
https://dexscreener.com/solana/Dd4hsmWhwEfkoRh2NxGXmbfYPh474K4yUXuoNmmPYALY
#NOTGAY#SOLANA#TESLACALLS
🔥$MEMECARD
When Solana joined Mastercard's crypto partner program, it signaled crypto entering global payments-but on Solana innovation comes from the internet.
Discord: https://discord.gg/72wPyXsM
X: https://x.com/memecardss?s=21
Website: https://memecard.fun/
🔗 Contract: https://solscan.io/token/ACc3ZBq1c9h7pofwn2J8b8bvRHvqMFwynVg8neLZpump
https://dexscreener.com/solana/CoZ9t3sCeYoNfZwU9kc7fFnpEjcBXptndNwpgbrpqZQR
#MEMECARD#SOLANA#TESLACALLS
🔥$SOS
Strategic Oil Supply ($SOS) is built to represent strength, resilience, and energy independence in the digital economy. Our mission is to create a decentralized reserve that empowers holders and fuels long-term value through a strong global community.
Telegram: https://t.me/sos_portal
X: https://x.com/i/communities/2031245794964344896
Website: https://sos.republican/
🔗 Contract: https://solscan.io/token/DpxKNEi3XVeRByaGqYKvz2w6E2PhPgBAqdayLcQEpump
https://dexscreener.com/solana/BM7Qw7JbGtyLoZw3canKF6Q6EJDp1Q3PYuHQhTNwoq2D
#SOS#SOLANA#TESLACALLS
$ROSIE is showing early momentum. Market activity remains stable with minor consolidation, and the market cap sits at approximately $105K. Initial indicators point to renewed investor interest.
https://dexscreener.com/bsc/0xe8298b28bf4ee4c9c87b8d26d8d2a237f5f54e23
#ROSIE#BSC#TESLACALLS
🔥$FROGS
Rolled the dice on this BSC play dip hunters know the drill: time it right, and always DYOR.
X: https://x.com/christanxsx/status/2019762141427900628?s=46
🔗 Contract: https://solscan.io/token/0xC3B1A6229D9017376cF9a5Ba7a60782BD8dB4444
https://dexscreener.com/bsc/0x3357047F963d6459FB8C4e43c78392e09734e53C
#FROGS#BSC#TESLACALLS
Another day, another planet… we’ll send a picture from there soon 🤭🚀
The $WHITEHOUSE narrative is gaining attention momentum continues to build as the community grows stronger.
CA:
7oXNE1dbpHUp6dn1JF8pRgCtzfCy4P2FuBneWjZHpump
#WHITEHOUSE#SOLANA#TSLA#TESLACALLS🌍🚀