Установить свойства виджета в 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
🔥 Israeli tanks close in on Palestinian hospital. Doctors & staff warned to leave, even if patients remain. Artillery assaults follow. Indonesian Hospital targeted, 12 killed. 21 out of 35 Gaza hospitals out of service. Premature babies evacuated due to contaminated water. Israel's occupation of al-Shifa. West Bank hospitals raided. Israel claims it targets Hamas, but evidence lacking. Real reason? Psychological warfare, says analyst. Israel wants Palestinians to feel unsafe. US's support enables Israel's actions. But global outrage may force a change. Stay tuned. #GazaUnderAttack
https://www.aljazeera.com/features/2023/11/20/why-does-israel-target-palestinian-hospitals-psyops-say-analysts
Subscribe to @BadVolfNews
🔴 Over 50 dead in Israeli strike on Al-Maghazi refugee camp in central Gaza. 🏢 Palestinians fleeing Israeli-controlled territories are residing in these refugee camps. 🚀 Hamas claims 60 Israeli captives killed in retaliatory strikes. ⚠️ Chances of survivors are slim due to ongoing bombardments. 💔 The conflict continues to escalate. #GazaUnderAttack
https://www.gazeta.ru/army/news/2023/11/05/21644179.shtml
Subscribe to @BadVolfNews
📢 Mr. Biden, look at the devastation caused by Israel in Gaza. Innocent lives lost, families destroyed. You turn a blind eye, offering support to Israel. Do Palestinian lives not matter? Can you justify this blood on your hands? History won't forget your complicity. #GazaUnderAttack
https://www.aljazeera.com/opinions/2023/11/4/a-letter-to-president-biden-from-a-grieving-palestinian
Subscribe to @BadVolfNews
Israeli immigrants are experts in killing children.
Os imigrantes israelenses são especialistas em matar crianças.
İsrailli göçmenler çocukları öldürme konusunda uzmandır.
#GazaUnderAttack
https://t.me/YediotNewsChat
🔴 BREAKING NEWS 🔴
Israeli bombardment of Nuseirat refugee camp in Gaza claims lives of 14 innocent people, including women and children. More casualties expected as rescue efforts continue. Despite ceasefire, Israel accuses Palestinians of violating agreement, escalating tensions. 110 hostages released, but 137 still held by Hamas. #GazaUnderAttack#HumanitarianCrisis
https://ria.ru/20231203/gaza-1913406714.html
Subscribe to @BadVolfNews
🔴Catastrophic situation at Indonesian Hospital in northern Gaza‼️ Israeli tanks surround the facility after artillery fire kills 12 Palestinians💔 700 people trapped inside, including medical staff and wounded😰 Hospital denies presence of armed militants🚫 International condemnation mounts🌍 UN reports collapse of services in northern Gaza hospitals🏥 Israel claims Hamas built infrastructure below hospitals for military use💣 Terrifying sounds of explosions and gunfire😨 Death toll rises as Israel's offensive continues🔥 Stay tuned for updates! #GazaUnderAttack#HumanitarianCrisis
https://www.aljazeera.com/news/2023/11/20/israeli-tanks-surround-gazas-indonesian-hospital-after-killing-12-people
Subscribe to @BadVolfNews
🔴 Gaza's smallest refugee camp pounded by Israeli airstrikes. Palestinians digging up bodies of loved ones under rubble. Over 90 killed, including children and displaced families. Entire residential blocks wiped out. Camp housing estimated 100,000 people. No warnings given. No aid, fuel, or excavators. Need ceasefire! Arab world, stand with us! #GazaUnderAttack#CeasefireNow
https://www.aljazeera.com/features/2023/12/28/piles-of-body-parts-gazas-maghazi-residents-find-families-in-pieces
Subscribe to @BadVolfNews
🚨 Alarming news from Gaza 🚨
Israeli attacks continue to wreak havoc:
- Al-Buraq School targeted, 25 martyrs confirmed
- Schools, mosques, and hospitals hit repeatedly
- Thousands displaced, seeking refuge in schools
- Death toll rises to 11,078 Palestinians, 1,400 Israelis
- Over 50% of housing units damaged
- UN: Northern Gaza is like a "hell on Earth"
Stay tuned for more updates. #GazaUnderAttack#PrayForGaza
https://www.aljazeera.com/news/2023/11/10/gaza-hospital-says-received-50-bodies-after-strikes-on-school
Subscribe to @BadVolfNews
🚨 Israeli airstrikes continue in Gaza 🚨
Jabalia refugee camp hit for the second day, dozens killed and wounded 😢
Rescuers scramble to find survivors and recover bodies 😭
Israel claims it targeted Hamas, but families wiped out 😡
International condemnation grows, EU calls for humanity ✊
#GazaUnderAttack#StopTheViolence
https://www.aljazeera.com/news/2023/11/1/israel-bombs-jabalia-refugee-camp-for-second-day-palestinian-officials-say
Subscribe to @BadVolfNews
🔴 Urgent: Gaza power blackout due to Israel's blockade prompts international condemnation. Hospitals risk becoming morgues. ICRC calls situation "abhorrent". Clean water access and healthcare at risk. HRW labels blockade a war crime, accuses Israel of collective punishment. Israel refuses aid until abducted Israelis are released. Humanitarian crisis unfolding. World urged to take action. #GazaUnderAttack#EndTheBlockade
https://www.aljazeera.com/news/2023/10/12/gaza-hospitals-risk-turning-into-morgues-rights-groups-call-for-action
Subscribe to @BadVolfNews
+18
Бүгүн Палестиналык кичинекей балдар өлтүрүлдү Израильдин учактык сокусунан кийин.
Палестинские дети убиты сегодня в результате авиаударов Израиля в секторе Газа.
Palestinian children killed by Israeli air strikes in Gaza today. #غزة#gazaunderattack#gaza#غزة_تحت_القصف
Mientras el mundo se moviliza por Palestina y tratar de desbloquear Gaza, EE.UU. aprovecha de atacar a Irán con impunidad.
Así negocia EE.UU.
Qué alivio saber que Donald Trump sigue comprometido con "la diplomacia"... a su manera. No hay mejor Acuerdo de Paz que advertirle a un país entero que será reducido a cenizas.
#iran
#gaza
#gazaunderattack
#breakthesiege
#usdiplomacy
#diplomacy