Установить свойства виджета в 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
Day One #Token2049
Our CEO Star_OKX takes the stage at TOKEN2049
The new money era is here:
✅ Everything onchain
✅ Self-custody first
✅ Verify before trust
OKX is building this future - one wallet, one transaction at a time.
Our Socials:
⚜️TG | DC | Wallet TG | Wallet Announcement | OKX on Spotify | Twitter/X | YouTube
‼️Please check the authenticity of all OKX links or channels at OKX channel verification
Singapore, lights on. #Token2049
Yesterday, Star_OKX takes the big stage and Haider brings us the fireside chat.
Stay locked, fam 👀
Our Socials:
⚜️TG | DC | Wallet TG | Wallet Announcement | OKX on Spotify | Twitter/X | YouTube
‼️Please check the authenticity of all OKX links or channels at OKX channel verification
Our CEO
Star_OKX
takes the stage at #TOKEN2049
The new money era is here:
✅ Everything onchain
✅ Self-custody first
✅ Verify before trust
OKX is building this future - one wallet, one transaction at a time.
Still day one.
Check out now👈
Our Socials:
⚜️TG | DC | Wallet TG | Wallet Announcement | OKX on Spotify | Twitter/X | YouTube
‼️Please check the authenticity of all OKX links or channels at OKX channel verification
The BNB Chain Incubation Alliance, Singapore agenda is here 🤩
Join us at #Token2049: https://lu.ma/m91xxlbk
This event is sponsored by $WHY, Lorenzo Protocol, D11 Labs, Seraph, Xterio, Solv & Particle Network
Join us at #Token2049 as we continue our mission to onboarding the next billion Web3 users at BNB Incubation Alliance, Singapore 🇸🇬.
Be part of the movement via the link below 👇
https://lu.ma/m91xxlbk
💖 We're thrilled to announce that we'll be part of the exclusive #TOKEN2049 side event, 'DeFi 2049 – Beyond THE Horizon', co-hosted by our partner DEX, THENA, & DeThings! 🎙️
Join us alongside BNB chain, Simon's Cat, Orbs network, Lista, and many more projects!
🧵 Learn more: lu.ma/h9w9yxww
🚀#TOKEN2049 Dubai wrapped up a few impactful days of ecosystem insights and momentum.
VCs remain selective, but capital is shifting towards liquid opportunities, AI infrastructure, and RWAs.
Sui Foundation saw strong engagement from builders and investors, Sonic Labs is gaining traction, Falcon Finance marked its public launch, and there’s much more to unpack 🙌🏼
Read the full recap for detailed insights — and find out where to meet us next!
Guess where we are 🐤✨️
It's been a busy #token2049 and we are not stopping!
Up next, we are at Algorand Royale where our Business Partner of Ecosystems, Alessia Baumgartner, will be sharing on a panel "How to survive and thrive as a Web3 company" 🙌🔥
Join us here 🤩
Excited to be one of the co-hosts and partners of this reception happening alongside #Token2049 in 🇸🇬!
Let's get connected and build together 🫡⚡
Date: 17th September, 2024
Time: 6PM - 10PM
Don't wait, register here🔗
KBW has been a blast 🐥✨️
It's been an amazing night hosting all of our guests at DWF Labs Haus 🎉
We hope you enjoyed your time with us and we'll see you again at our next event 🫡🔥
Next stop 🇸🇬 here we come! #TOKEN2049