Установить свойства виджета в 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
Roberto #Speranza: "Articolo Uno oggi smette di essere un partito politico. Dobbiamo guardare con fiducia al futuro. E il nostro investimento sarà tutto rivolto a dare forza al nuovo Pd."
@UltimoraPolitics
#Italia
Roberto #Speranza dice sì alla lista unitaria proposta dal segretario del Pd Enrico Letta. Lo scrive La Repubblica, anticipando che l'ufficialità dell'adesione di Articolo 1 arriverà mercoledì
@UltimoraPolitics
Minacce choc sui social a Giorgia #Meloni: "ammazzo te e tua figlia"
Solidarietà dall'ex ministro #Speranza: "le minacce alla vita dei familiari sono oltre ogni limite."
@UltimoraPolitics
Inchiesta Covid, Pm Bergamo: "Roberto #Speranza aveva firmato una bozza di decreto per estendere a Nembro e Alzano Lombardo la zona rossa. Ma la bozza non fu firmata da Giuseppe #Conte". L'ex presidente del Consiglio: "Mai avuta in mano tale bozza"
@UltimoraPolitics
#Italia
Si sono recentemente conclusi i congressi territoriali di #A1MDP|S&D, la lista di Roberto #Speranza supera il 90%. (BiDiMedia)
@UltimoraPolitics
Il Tribunale dei Ministri archivia le posizioni dell'ex premier Giuseppe #Conte e dell'ex ministro della Salute Roberto #Speranza indagati nell'inchiesta della Procura di Bergamo sulla gestione della prima ondata Covid nella bergamasca
@UltimoraPolitics24
Inchiesta Covid, Pm Bergamo: "Roberto #Speranza aveva firmato una bozza di decreto per estendere a Nembro e Alzano Lombardo la zona rossa. Ma la bozza non fu firmata da Giuseppe #Conte". L'ex presidente del Consiglio: "Mai avuta in mano tale bozza"
@UltimoraPolitics
"In un tempo in cui le persone sono spesso tentate da un senso di disperazione, abbiamo la missione essenziale, come messaggeri cristiani di #speranza, di portare la luce del Signore negli angoli più bui del nostro mondo". Lo ha detto Papa #LeoneXIV ricevendo, nella biblioteca privata del Palazzo Apostolico, la Delegazione Ecumenica della #Finlandia, giunta, come da tradizione, in pellegrinaggio a #Roma in occasione della festa di Sant’Enrico.
"Sebbene il Giubileo si sia ormai concluso, la nostra speranza cristiana non conosce fine né limiti. Così, incoraggiati e rafforzati dalla grazia di Gesù Cristo, che è l'incarnazione stessa della speranza per tutti, siamo chiamati e inviati a testimoniare questa verità salvifica con parole edificanti e opere di carità", ha proseguito il Pontefice, citando "i numerosi segni di speranza che si trovano tra i cristiani di Finlandia. Sono stato lieto di apprendere che la Finlandia è stata descritta come 'un paese modello per l'ecumenismo'. So che i vescovi di Helsinki, in una dichiarazione trilaterale ortodosso-luterano-cattolico, stanno cercando di promuovere una 'cultura di speranza, dignità e compassione' e hanno affermato congiuntamente che 'lo sviluppo delle cure palliative e di fine vita deve continuare'".
È anche degno di nota che la Conferenza episcopale cattolica nordica abbia riconosciuto il documento del dialogo nazionale cattolico-luterano, "Comunione nella crescita", nella sua "Dichiarazione di accoglienza" dello scorso settembre, definendolo una "preziosa pietra miliare nel cammino ecumenico".
"Tali esempi di cooperazione, insieme alla lunga tradizione di celebrare congiuntamente la festa di Sant'Enrico, sono segni eloquenti di un ecumenismo pratico e fruttuoso e possono servire a incoraggiare la sesta fase del dialogo internazionale cattolico-luterano, che inizierà il mese prossimo. Cari amici, con questi pensieri, vi auguro una visita piacevole e produttiva a Roma".
"Come segno della nostra amicizia in Cristo, vorrei ora invitare tutti voi, tutti noi, a pregare insieme il Padre Nostro in inglese", ha concluso il Papa.
#Italia #CongressoA1MDP Roberto #Speranza (#A1MDP|S&D): "Chiedo a Letta: se si fa la sinistra noi ci siamo. Lo abbiamo già detto nelle nostre campagne. E lo ribadiamo oggi. Se si fa la sinistra, che serve all’Italia e all’Europa, noi ci siamo." @UltimoraPolitics