Установить свойства виджета в 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
🌙#Hashtag’chilarim, ulugʻ ayyom - Qurbon hayiti muborak!
🐑 Keltirilayotgan qurbonliklar dargohida qabul boʻlsin.
✈️ Eng yaxshi tilaklar va albatta, eng yangi gadjetlarni tilab qolaman.
😎Hurmat bilan, JM!
Hammaga salom!
Ha, ancha yo'q bo'lib qoldim, postlar qo'yilmadi, ijod qilinmadi. Sabablar yetarlicha, afsuski.
Kuz fasli oilamiz uchun quvonarli kelib, o'g'il farzandli bo'lgandim. Kuz oxiriga kelib esa Otam bilan bog'liq kutilmagan fojea yuz berib, 29-oktyabrda reanimatsiyaga tushib qoldilar. Allohning irodasi ekan, 46 kunlik og'ir betoblikdan keyin Otam 14-dekabr kuni vafot etdilar...
Shu-shu, dafn marosimlari bilan ovora bo'lib, o'zimning sog'ligim va halovat yo'qligi bois kanalga yangilik joylashtira olmadim. Lekin, hayot davom etarkan. O'zimda kuch to'plab, sekin-asta ishga, ijodga qaytyapman. Shu sabab, sizning qo'llab-quvvatlab turishingiz zarur menga.
Rahmatli Otamni sizlarga keyinroq batafsil tanishtirmasam bo'lmaydi. Chunki ular #Hashtag blogimning qandaydir ma'noda asoschisi ham. 6 yoshligimdan qo'limga "payal'nik" berib, tranzistor-u diodlarni, kondensator va rezistorlarni tanishtirgan, birinchi radio, robotlarimni yasashni o'rgatgan aynan Otam - Bekpo'lat o'g'li Faxriddin!
Adamni ohirati obod bo'lsin, Jannatlarda uchrashish nasib etsin. Duolaringizda eslab qo'ysangiz, sizdan minnatdorman. 🤲🏻
⚠️ Endi 9/11 men uchun yomon sana emas!
🎉 Bu xursandchilikni sizlar bilan bo'lishgim keldi. Bugun oilamizda "kichkina #hashtag" dunyoga keldi, Alhamdulillah.
🤲 InshaAllah yurtimizga, dinimizga xizmat qiladigan o'g'il bo'lsin. "Ayti" bo'yicha bilimi kuchli, sportdayam tengsizlar qatorida bo'lib, O'zbekiston bayrog'ini yuqoriga ko'p marotaba ko'tarishini niyat qildim (orada bayrog'imizni Oyga, Marsga qo'yishini ham o'yladim, to'g'risi 😅)
☺️ Oldindan bildiriladigan tilaklar va tabriklar uchun rahmat, #Hashtag oilasi!
🏆 OKX Bounty Hunt New Season #2🏆
Engage, Refer & Win!
Prize:
- $400 USDT weekly allocation
🥇 $80 | 🥈 $60 | 🥉 $40
4th to 6th - $20
7th to 10th - $15
11th - 20th - $10
How to earn points:
✅ Check In Daily -> GM OKX Fam #OKXBountyHuntNewSeason#2 every day 👉50000
✅ Chat & Engage - Chat actively (30+ characters) 👉30
✅ Invite Friends - 🔗 Tag Admins to get your personal invite link and invite more people to join OKX Announcement👉50
✅ Share your reactions/emojis under the announcement posts
Check points🏆
Bounty points
Bounty ranking
More points!
👉 Share pictures and topics of New Year and crypto with the #hashtag in the chat
Join the event now👇👇👇
OKX Bounty Hunt New Season #2 Form
Our Socials:
⚜️Sign Up on OKX | Join Affiliate | TG | DC | Wallet TG | Wallet Announcement | OKX on Spotify | Twitter/X | YouTube
⭐️CN DC | CN TG
‼️Please check the authenticity of all OKX links or channels at OKX channel verification
🏆 OKX Bounty Hunt New Season #1🏆
Engage, Refer & Win!
Prize:
- $400 USDT weekly allocation
🥇 $100 | 🥈 $50 | 🥉 $30
4th to 6th - $20
7th to 10th - $15
11th - 20th - $10
How to earn points:
✅ Check In Daily -> GM OKX Fam #OKXBountyHuntNewSeason#1 every day 👉50000
✅ Chat & Engage - Chat actively (50+ characters) 👉20
✅ Invite Friends - 🔗 Tag Admins to get your personal invite link and invite more people to join OKX Announcement👉50
✅ Inviters earns extra 👉 10 per message sent by the invitee
✅ Share your reactions/emojis under the announcement posts
Check points🏆
Bounty Points
Bounty Ranking
More points!
👉 Share pictures and topics of New Year and crypto with the #hashtag in the chat
Join the event now👇👇👇
OKX Bounty Hunt New Season #1 Form
Our Socials:
⚜️Sign Up on OKX | Join Affiliate | TG | DC | Wallet TG | Wallet Announcement | OKX on Spotify | Twitter/X | YouTube
⭐️CN DC | CN TG
‼️Please check the authenticity of all OKX links or channels at OKX channel verification
Chat-Specific Hashtags. Groups and channels can use the new format#hashtag@username for hashtags – which only show posts and stories from the same chat when tapped.
October Features
1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • More