Установить свойства виджета в 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
Innei 向 mx-space/core 提交了一个更改
refactor: remove TextMacroService and textOptions config
TextMacroService (text macro replacement for `[[ $var ]]` / `[[ #fn() ]]` syntax)
is no longer needed. All replaceTextMacro calls replaced with direct text usage.
- Delete helper.macro.service.ts and its test/mock files
- Remove TextMacroService injection from post, page, note, markdown modules
- Remove textOptions schema, default config, and DSL section
- Update v10 migration docs with breaking change notice
#Italia#Camera
#FN|ESN ha negato per la seconda volta consecutiva la fiducia al governo Meloni. Il partito di Vannacci si colloca ufficialmente all’opposizione.
@Osservatorioitaliano
#Italia
Roberto #Vannacci (#FN|ESN): "L'immigrazione distrugge anche il calcio. La Serie A oggi è il campionato più ricco di stranieri in Europa: il 67,5% dei giocatori non è italiano, 384 su 569, una percentuale che supera perfino la Premier League. Questo modello orientato al business favorisce i club ma ‘svuota’ il vivaio nazionale: la Nazionale, infatti, può pescare solo da un bacino che rappresenta il 30% del campionato. Il risultato è una crisi strutturale, confermata dalla terza mancata qualificazione consecutiva ai Mondiali e da anni di mancati investimenti sui giovani. I club oggi vedono la maglia azzurra come un ‘fastidio’ che non produce ricavi e preferiscono acquistare giocatori stranieri già pronti, invece di far crescere talenti italiani."
@OsservatorioItaliano
#Italia#Marche
Il sindaco di Civitanova Marche Fabrizio Ciarapica lascia #FI|EPP e aderisce a #FN|ESN: è il primo sindaco “futurista” di un comune italiano superiore.
@Osservatorioitaliano
#Italia
Joe #Formaggio ufficializza il passaggio a #FN|ESN, abbandonando #FdI|ECR, e segnando il terzo passaggio importante in pochi giorni nel partito di Vannacci in Veneto. Poche ore dopo l’annuncio, un incendio ha danneggiato il ristorante di Formaggio.
@Osservatorioitaliano
#Italia
L’ex sottosegretario al lavoro del governo Berlusconi Luca #Belotti, con un passato tra i finiani, lascia #FdI|ECR e aderisce a #FN|ESN.
@OsservatorioItaliano
#Italia#Camera
❗Edoardo #Ziello (#FN|ESN) ha appena votato "NO" alla questione di fiducia al governo Meloni, passando ufficialmente all'opposizione.
@OsservatorioItaliano
#Italia#Camera
❗Rossano #Sasso (#FN|ESN) ha appena votato "NO" alla questione di fiducia al governo Meloni, passando ufficialmente all'opposizione.
@OsservatorioItaliano
#Italia
L'ex sottosegretaria alla Salute dal 2009 al 2011 durante il governo Berlusconi, Francesca #Martini, lascia la #Lega|PfE e aderisce a #FN|ESN.
@OsservatorioItaliano
#Italia#Camera
❗Emanuele #Pozzolo (#FN|ESN) ha appena votato "NO" alla questione di fiducia al governo Meloni, passando ufficialmente all'opposizione.
@OsservatorioItaliano
#Italia#Veneto
Vicenza, in città compaiono locandine per un evento di #FN|ESN organizzato dall’ex consigliere Joe #Formaggio, che sarebbe ad un passo dal lasciare #FdI|ECR per passare con Vannacci
@OsservatorioEsteri