Установить свойства виджета в 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
🔥
🔥
🔥#OLIMPIADA
🟢ASOSIY OLIMPIADANING RESPUBLIKA BOSQICHIGA START BERILDI
✅Avval xabar berilganidek,24-martdan boshlab, Asosiy olimpiadaning Respublika bosqichiga start beriladi.
✈️Bugun belgilangan manzillarga ishtirokchilar yetib borishdi. Viloyatimizdan 57 nafar o‘quvchilarimiz mazkur olimpiadada ishtrok etishi kutilmoqda.
🌍🌍🌍🌍🌍🌍
Kanalni yaqinlaringiz bilan ulashing
❤https://t.me/toshkentv_xtb| 🌐Facebook|
🔎Veb-sayt | 🌐Instagram|▶️YouTube
👍@ToshvilmmtbgamurojaatBot
#olimpiada
🔴"Akademik Qori Niyoziy merosi" ilmiy-metodik markazi, Matematika instituti hamda Aniq va ijtimoiy fanlar universiteti hamkorligida maktab Matematika fani oʻqituvchilari uchun mukofot jamgʻarmasi 20 000 000 so'm boʻlgan Qori Niyoziy olimpiadasining 1-bosqichi (saralash) o'tkazildi.Unda 56 va undan yuqori ball to‘plagan barcha (jami 235 kishi) 2-bosqichda qatnashishi mumkin.
Natijalar bilan ushbu havola orqali tanishishingiz mumkin: bu yerda
2-bosqich 5 ta yozma ish (har biri 10 balldan) topshiriqlaridan iborat bo'lib, unda maksimal 50 ball to'plash mumkin.
Eslatma: 2-bosqich natijalarini hisoblashda 1-bosqichda olingan natijalar qo‘shilmaydi!
Olimpiadaning 2-bosqichi Toshkent shahrida 2-noyabr (yakshanba) kuni soat 09:30 da Aniq va ijtimoiy fanlar universitetida o‘tkaziladi. Qatnashuvchilar shaxsni tasdiqlovchi hujjat bilan kelishi talab qilinadi.
📍Aniq va ijtimoiy fanlar universitetining manzili:loc.aifu.uz
D'Angelo Russell actively supported his Lakers teammates. He was especially thrilled with Anthony Davis’s alley-oop dunk following LeBron's assist.
#Olimpiada
👁Subscribe to Main Event | Sport News
Do you remember that Chinese player who is 230 cm tall? He is now an assistant coach for the women's national team.
#Olimpiada
👁Subscribe to Main Event | Sport News
Jason Tatum and Tyrese Haliburton did not play in the first match against the Serbian national team.
Such different reactions! One thinks, "Why am I not playing?" Meanwhile, the other thinks, "I can't believe I'm here."
#Olimpiada
👁Subscribe to Main Event | Sport News
Any American athlete who wins a gold medal in Paris will receive a bonus of $37,500. That’s just enough for LeBron James to buy a couple of bottles of wine.
However, for Hong Kong, winning an Olympic gold medal holds much greater value—$768,000.
#Olimpiada
👁Subscribe to Main Event | Sport News
The first father-son duo in Olympic history. It can confidently be said that they have outpaced LeBron and Bronny. Bravo!
#Olimpiada
👁Subscribe to Main Event | Sport News
Griezmann is the top supporter of the French team at the Olympics. He's spending his vacation at the Games and has already attended rugby, gymnastics, swimming, fencing, and equestrian events.
#Olimpiada
👁Subscribe to Main Event | Sport News
At 229 centimeters tall, Yao Ming looks like a giant compared to the other coaches of the Chinese women's basketball team.
#Olimpiada
👁Subscribe to Main Event | Sport News
French swimmer Marchand won gold in the 400m individual medley, setting a new Olympic record and taking it from Michael Phelps.
#Olimpiada
👁Subscribe to Main Event | Sport News
The unexpected hero of the day at the Olympics: a man in bright swim trunks jumped into the water and retrieved the cap that had fallen off a swimmer from the previous race.
#Olimpiada
👁Subscribe to Main Event | Sport News
The captain of Japan's women's gymnastics team, Seko Miyata, might miss the Olympics because she smoked a week before the Games. The 19-year-old athlete faces exclusion from the team as smoking and purchasing tobacco are illegal in Japan until the age of 20.
#Olimpiada
👁Subscribe to Main Event | Sport News