Установить свойства виджета в 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
'Okkupert', distopía noruega antirrusa
La serie que recomendamos hoy puede parecer muy actual, dado el clima de rusofobia que se respira en Occidente, y, sobre todo, en sus medios de comunicación: un país europeo es víctima de una invasión rusa.
La trama de 'Okkupert' ('Occupied') (2015-2020) comienza con la elección soberana del Gobierno noruego de renunciar a los combustibles fósiles en favor del torio y en ese momento, el guion da un giro distópico en el que Occidente, encabezado por la Unión Europea, da un golpe para que Oslo continúe bombeando petróleo y gas a sus socios y para ello utilizan a Rusia de ariete.
La UE obligará a Oslo a cumplir con el suministro, haciendo que Rusia ocupe el país y controle pozos y plataformas y se despliegue en el territorio. De esa forma comienza un sentir patriótico noruego para sacar a los rusos, aunque a lo largo de la serie queda claro que los enemigos son los europeos y los propios noruegos…
Cualquier parecido con la tensión actual es pura coincidencia…
En algunos países las 3 temporadas están disponibles en Netflix, Apple TV o Amazon Prime Video.
¿Por cierto creen que un escenario así podría darse y más cuando ha sido Noruega la que colaboró con la voladura del gasoducto Nord Stream, según un galardonado periodista estadounidense?
#Series
Síguenos si amas el cine y las series:
🎥Luces, cámara y ¡acción!
Короче
Я посмотрела 8 серий "Мыши" и я дропаю
Скучилищно и нелогично
А ещё персонаж, который мне единственный понравился, умер. В общем, я не поняла гениальности задумки
#Series@small_syzrann
Вчера досмотрела шестую серию "Мыши".
Могу сказать, что мне нравится, даже очень. Сюжет интересный, хотя мне немножко не хватает "вотэтоповоротов".
Плоттвист в конце шестой серии я предугадала, потому что как будто бы в целом это было ожидаемо, но всё равно интересно, как это будут разруливать дальше.
#Series@small_syzrann
Самое главное и самое часто употребляемое слово в "Триггере" это...щибаль, конечно же >DDD
Мне кажется, здесь это самое универсальное слово. Щибаль? Щибаль!
#Series@small_syzrann
Я так ждала "Дорогу личи", а она оказалась капец какой скучной. Смотрю 5ю серию и жду где будет роад стори. Потому что пока что тут дохуя неясные политические интриги, которые я без контекста не понимаю. А чтобы понимать контекст, нужно понимать период правления Тяньбао и чо там происходило. Пока что тут все пытаются друг друга подсидеть и сохранить свою жопу. И всё это ужасно муторно и скучно.
#Series
Блиать. Простите это очень смешно и очень черно
8 серия "Злого духа", девочки празднуют экзамен
Сэми: это злой дух велел тебе соблазнить Хонсэ?
Санён: а?
Сэми: Я дала шанс признаться, а ты не хочешь. Ты сидела рядом с ним и улыбалась вот так ☺️🤭 Затем припала к его плечу и прошептала что-то на ухо
Что в это время шептала Санён:
#series
Итак, я почти пришла в себя и начала смотреть "Личи Чанъаня" попутно с корейским "Злым духом".
По итогу первых полутора серий можно смело дать сериалу второе название "Сдохни или умри"
#series
Уже 11 лет прошло, а Марти и Раст все еще куда-то едут... >DDD
(Если вы не смотрели первый сезон "Настоящего детектива", то настоятельно советую посмотреть).
#series