Установить свойства виджета в 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
⚫️ У правящей партии мысль об европейской интеграции переводится просто: униря. Ткачук рассказал о "проевпропейскости" PAS и Ивана Чебана.
◻️ О PAS:
"Я не верю в проевропейскость правящей партии, потому что это чистая геополитика. ... У нас же теперь всё про геополитику. При этом мы существуем в условиях чрезвычайного положения, в условиях внесудебных санкций и решений, причём секретных, в условиях цензуры. Мы существуем в условиях, когда над Конституцией издеваются, как хотят. Мы существуем в условиях, когда спецслужбам предоставляются права Третьего жандармского управления времён Николая II..."
◻️ О Чебане:
"Его европейская интеграция видна. При всём том, что Чебану иногда хочется бежать впереди паровоза и биться головой об пол, и кричать: "Я свой, я буржуинский!" При этом мы видим определённые проекты, форумы, мероприятия..."
#гражданскийконгресс#congresulcivic
✅Перед выборами Санду обещала лично договариваться о газе.
👉Из предвыборной программы кандидата в президенты Майи Санду:
"Проведу переговоры с Россией с целью разрешения проблем, связанных с поставкой природного газа по конкурентоспособным ценам».
✅Провела? Нет, Санду заявила, что это не её дело, а договариваться должны хозяйствующие субъекты.
🟥Результат известен: за её нарушенное предвыборное обещание и за её геополитические комплексы платим все мы, причём, ежемесячно.
#гражданскийконгресс#congresulcivic
❗️Михаил Полянский, член Исполкома Гражданского конгресса, отмечает, что в Молдове ввели ЧП не из-за долгов, а из-за некомпетентности высшего руководства страны: «Потому что тема аванса, частичной предоплаты за потреблённый газ – это не нововведение».
«Власти просто забыли про условия договора. И если у экономического агента нет денег, то правительство должно вмешаться. Иначе пострадают граждане страны. И тут следует понимать, что государство может сделать всё что угодно (соблюдая законную процедуру): и дать денег экономическому агенту, и одолжить... Только решать вопрос надо вовремя, а не когда сотрудники «Газпрома» уже подошли к вентилю газовой трубы», - пишет Полянский.
▫️Он подчеркнул, что за жизнь и здоровье граждан отвечает не хозяйствующий субъект, а государство.
"Если страна погружается в хаос, то спрашивать, по-моему, нужно именно с властей. Особенно в ситуации, когда по их вине, из-за отсутствия логики в действиях, происходит этот цирк», - подчеркнул он.
#гражданскийконгресс#congresulcivic
💬«Важно понимать, что не существует просто приднестровской проблемы между Кишиневом и Тирасполем, есть вопрос сохранения молдавской государственности и ее независимости.
Для кого это не пустые слова — приднестровский вопрос является принципиальным. Для тех, кому независимость не нужна, Приднестровье — чемодан без ручки, от которого надо избавиться и провести границу по Днестру», - отметил Марк Ткачук, комментируя для Коммерсанта, назначение Олега Серебряна на должность вице-премьера по реинтеграции.
#гражданскийконгресс#congresulcivic
⚡️ «Совершенно не ясно, как долго будет тепло в домах и не окажемся ли мы в условиях двойного чрезвычайного положения. И по газу, и по пандемии.
Так что десяткам тысяч наших граждан, судя по всему, лечить пневмонии придётся в холодных домах и в неотапливаемых больницах. Это фиаско»,
- Михаил Полянский, представителель Исполкома Гражданского конгресса.
#гражданскийконгресс#congresulcivic
◽️ Политическая партия «Гражданский конгресс», которая пытается исповедовать подход нового типа (коллективное действие) после полугодового перерыва оправилась от поражения на выборах и собрала не только представительное мероприятие, но и мириады откликов на него в прессе, передает eNews.
#congresulcivic#гражданскийконгресс
❗️Igor Boțan a participat, la finele anului trecut, la ședința deschisă a plenului Partidului Acțiunii Comune „Congresul Civic”.
Comentând alocuțiunea lui Mark Tkaciuk, el a declarat că „Congresul”, potrivit observațiilor sale, pledează pentru trei importante transformări ale societății moldovenești. Prima dintre ele: cetățenii trebuie să înceapă a administra viața politică, relateaza Tribuna.
#congresulcivic#гражданскийконгресс
🤟"Давайте вместе откажем каким-то людям в возможности жить за наш счёт! То есть, быть каннибалами в социальном смысле! Давайте учиться проявлять солидарность не только по политическому признаку"
#congresulcivic#гражданскийконгресс
👉Результат «Гражданского конгресса» на парламентских выборах Иван Грек объяснил тем, что «наш избиратель, давно расфасованный по геополитическим корзинам, никак не может быстро и решительно обратить свой взор на тех, кто предлагает ему взглянуть на самих себя, на свое государство, на его и свое будущее».
#гражданскийконгресс#congresulcivic
⚡️Гражданский Конгресс заявляет: больше человеческих жертвоприношений быть не должно. Мы считаем, что мы – граждане Молдовы – приносим эти жертвы не от того, что мы бедные.
А мы бедные от того, что готовы всякий раз поступиться самым дорогим, чем нас наградила природа и история – жизнью и социальной свободой.
#congresulcivic#гражданскийконгресс