Установить свойства виджета в 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
#Italia
Comunali Giugliano 2025, sono almeno 13 gli indagati, tra cui ex consiglieri regionali e segretari provinciali. A beneficiare delle firme false sarebbero stati, oltre che cinque liste civiche, #PD, #IV, #Azione, #FI, #Lega, #FdI, #FI, #UdC e #NPSI
@OsservatorioItaliano
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia #Calabria #Catanzaro Ufficializzate le liste per le elezioni comunali di Catanzaro: ⚪ Antonio #Campo 📌 Catanzaro Oltre (#ItalExit) 🔴 Franco #DiLieto 📌 Insieme Osiamo (#PRC-#PaP-#SUD) 🔵 Valerio #Donato 📌 Alleanza per Catanzaro 📌 Riformisti (#NPSI)…
#Italia🇮🇹
#Comunali
#OrtaNova
A Orta Nova (Foggia) sono 4 i candidati a Sindaco.
Il centrodestra corre con Gerardo #Tarantino, sostenuto da Fratelli d'Italia (#FdI|ECR), Forza Italia (#FI|PPE) e da una lista civica.
Nicola #DiStasio è il candidato del Nuovo PSI #NPSI|PPE) e di due liste civiche.
Angela #Fazi è sostenuta da 2 liste civiche di centrosinistra.
Domenico #DiVito è sostenuto da 3 liste civiche.
@TuttoElezioni
#Italia🇮🇹
#Comunali
#SantElpidioaMare
A Sant'Elpidio a Mare (Fermo) la corsa è a 4.
Gionata #Calcinari è il candidato sostenuto da Fratelli d'Italia (#FdI|ECR), Lega (#LSP|PfE), #Azione|RE, Noi Moderati (#NM|PPE|PPCE), Nuovo PSI (#NPSI|PPE) e 3 liste civiche.
Il centrosinistra corre con Mirco #Romanelli, sostenuto dal Partito Democratico (#PD|S&D; senza simbolo), Alleanza Verdi e Sinistra (#AVS|F/EFA|LEFT) e da una lista civica.
È presente anche un candidato civico, Rossano #Orsili, sostenuto da 8 liste.
@TuttoElezioni
#Italia🇮🇹
#Comunali
#GiuglianoinCampania
A Giugliano in Campania (NA), comune non capoluogo più grande d'Italia (circa 124.000 abitanti), ci sono 3 candidati:
- Diego Nicola #DAltiero per il centrosinistra, sostenuto da Partito Democratico (#PD|S&D), #Azione|RE, Italia Viva (#IV|RE) e da 3 liste civiche;
- Salvatore #Pezzella, sostenuto da una lista civica;
- Giovanni #Pianese per il centrodestra, sostenuto da Fratelli d'Italia (#FdI|ECR), Forza Italia (#FI|PPE), Lega (#LSP|PfE; senza simbolo), Unione di Centro (#UdC|PPE), Nuovo PSI (#NPSI|PPE) e da 2 liste civiche.
@TuttoElezioni