Установить свойства виджета в 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
🍀127-я Кантонская ярмарка.: Стенд номер 10.3K21. Расписание прямых трансляций на 15-е июня, Пекинское время:
1. 10:00 - 11: 00 (7:00 - 8:00 по Ташкентскому времени) Средства автоматизации и контроля: контакторы CJХ2 и CJX2i, магнитный пускатель YCQC7, контактор для цепей компенсации реактивной мощности CJ19i и аксессуары для контакторов;
2. 14:00 - 15: 00 (11:00 - 12:00 по Ташкентскому времени) Модульный автоматический выключатель серии YCB6H и аксессуары;
3. 16:00 - 17: 00 (13:00 - 14:00 по Ташкентскому времени) Модульный автоматический выключатель серии YCB9 и аксессуары;
4. 19:00 - 20: 00 (16:00 - 17:00 по Ташкентскому времени) Распределительные устройства: Автоматические выключатели в литом корпусе YCM1 и YCM7, Воздушный автоматический выключатель и др.
Добро пожаловать в CNC Electric!
‼️Перейдите по ссылке в QR-код!‼️
#cnc#cncelectric#cncuzbekistan#cnctashkent#digitop#digitopuzbekistan#автоматика#электрика#электрик#электрощит#электротехническаяпродукция#electric#сборкащитов
Переключатель фаз PS-63A предназначен для питания промышленной и бытовой однофазной нагрузки 220/230В 50Гц от одной из фаз трехфазной сети, с целью обеспечения питания особо ответственного однофазного оборудования от наиболее качественной фазы и защиты его от повышенного или пониженного напряжения.
📱Телефоны:
(99) 844-00-30 Эргаш
(99) 843-00-30 Сардор
📠факс/офис: (71) 228-02-11
🌐website: www.cncele.uz, www.elcom.uz
📧e-mail: [email protected]
Instagram —»» https://www.instagram.com/cnc_uzbekistan/
Facebook —»» https://www.facebook.com/electromaxgroup/
Telegram —»» https://t.me/electromaxgroup
Youtube —»» https://www.youtube.com/channel/UCUmHJIxHuQtre1MG6XQ_12w
#cnc#cncelectric#cncuzbekistan#cnctashkent#digitop#digitopuzbekistan#автоматика#электрика#электрик#электрощит#электротехническаяпродукция#electric#сборкащитов
Реле напряжения Vp-16
предназначено для защиты оборудования и различных устройств от перепадов напряжения. При управлении большей мощностью нагрузки необходимо применять контактор. Монтаж на DIN-рейку.
📱Телефоны:
(99) 844-00-30 Эргаш
(99) 843-00-30 Сардор
📠факс/офис: (71) 228-02-11
🌐website: www.cncele.uz, www.elcom.uz
📧e-mail: [email protected]
Instagram —»» https://www.instagram.com/cnc_uzbekistan/
Facebook —»» https://www.facebook.com/electromaxgroup/
Telegram —»» https://t.me/electromaxgroup
Youtube —»» https://www.youtube.com/channel/UCUmHJIxHuQtre1MG6XQ_12w
#cnc#cncelectric#cncuzbekistan#cnctashkent#digitop#digitopuzbekistan#автоматика#электрика#электрик#электрощит#электротехническаяпродукция#electric#сборкащитов