Установить свойства виджета в 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
Maurizio #Gasparri rassegna le dimissioni da capogruppo del gruppo Forza Italia al Senato. Alle 16.30 è convocata a palazzo Madama la riunione per l'elezione del nuovo capogruppo. Quattordici dei venti senatori hanno sottoscritto la raccolta firme, fra cui…
Maurizio #Gasparri (#FI): "90% ministri saranno politici. Presidente Senato? Sarà eletto alla prima votazione, strano se non avvenisse"
@UltimoraPolitics
Maurizio #Gasparri (#FI): "Ho deciso autonomamente di lasciare il mio incarico da capogruppo di Forza Italia al Senato. Chi ha un lungo percorso basato sulla solidità e il senso del dovere e non solo sull'incarico che svolge, sa come gestire tempi e modalità in momenti complessi. Avanti con coerenza e guardando al futuro". (Rai)
@UltimoraPolitics24
Maurizio #Gasparri (#FI): "La politica dei dazi non ha migliorato la situazione americana, anzi l'ha peggiorata, ha creato problemi in giro per il mondo. Perseverare nella politica dei dazi è un grave errore". (ANSA)
@UltimoraPolitics24
Maurizio #Gasparri (#FI): "Nelle prossime ore sarà legge dello Stato un'altra importante riforma. Il Senato voterà la legge che riguarda la Corte dei Conti un organismo fondamentale che potrà funzionare meglio al servizio dei cittadini".
La magistratura contabile aveva espresso diversi dubbi sulle nuove norme pur mantenendo una linea di dialogo con l'Esecutivo. La preoccupazione dei magistrati riguarda il rischio di un ridimensionamento significativo del ruolo della Magistratura contabile. (Ansa)
@UltimoraPolitics24
#Italia
Dichiarazione di Maurizio #Gasparri dopo le sue dimissioni da Capogruppo al Senato di #FI|EPP:
"Ho deciso autonomamente di lasciare il mio incarico da capogruppo di Forza Italia al Senato. Chi ha un lungo percorso basato sulla solidità e il senso del dovere e non solo sull'incarico che svolge, sa come gestire tempi e modalità in momenti complessi. Avanti con coerenza e guardando al futuro".
@Osservatorioitaliano
#Italia
❗Maurizio #Gasparri si dimette da capogruppo di #FI|EPP al Senato: 14 senatori su 20 avevano firmato una lettera in cui si chiedeva un passo indietro.
@Osservatorioitaliano
#Italia
❗Maurizio #Gasparri si dimette da capogruppo di #FI|EPP al Senato: 14 senatori su 20 avevano firmato una lettera in cui si chiedeva un passo indietro.
@Osservatorioitaliano
#Italia#Senato
Maurizio #Gasparri (#FI|EPP): "Il senatore Vito Petrocelli minaccia di fare ricorsi alla Corte costituzionale per difendere la sua poltrona. E perché non all'Onu? Che situazione ridicola."
@UltimoraPolitics
Licia #Ronzulli è eletta vicepresidente del Senato con 102 voti favorevoli, 50 schede bianche, 5 nulle e 6 ad altri nomi. Il voto è avvenuto a scrutinio segreto. La senatrice di #FI subentra a Maurizio #Gasparri, in una staffetta proposta dal partito azzurro
@UltimoraPolitics