Установить свойства виджета в 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
🚨🇻🇪#VIRAL
Trabajadores petroleros de Venezuela reclaman que ellos se parten el lomo sacando el petróleo que "Tanto le gusta a Trump", "para los Chinos, para los Rusos" y son incapaces de darles un salario digno.
Cómo lo merecen todos los trabajadores de Venezuela
Les eaux d'Oman sont devenues rouges
L'eau près de la ville de Mirbat a changé de couleur en raison d'une mortalité massive de crevettes, ont indiqué des habitants à Sputnik.
Cette mortalité est due à des variations de température et à des fluctuations du taux d'oxygène dans l'eau de mer, et non à la pollution, selon les autorités.
#viral
👮♀️Un robot policier humanoïde patrouille aux côtés des forces de l'ordre
On dirait le tournage d'un nouvel opus du célèbre film de science-fiction RoboCop, mais non, la scène est bien réelle.
Cette séquence a été immortalisée à Shenzhen, dans sud de la Chine et la vidéo ne cesse de faire le tour des réseaux sociaux.
🤔 Mais est-ce que tout le monde est prêt à faire confiance à un robot policier?
#viral
▶️ Un éléphant enragé a tué un homme dans un temple hindou en Inde
Amené sur place pour une cérémonie de bénédiction, l’animal s'est libéré de sa chaîne et a tout saccagé pendant deux heures, selon la presse locale.
Il a également blessé une autre personne avant d'être maîtrisé à l'aide d'une fléchette tranquillisante.
#viral
🌋 Les cendres d'un volcan transforment le jour en nuit
Le volcan Mayon, l'un des plus actifs aux Philippines, est entré en éruption.
⛔️ Les autorités ont interdit l'accès dans un rayon de six kilomètres pour protéger la population.
#viral
Suspendus la tête en bas dans une rivière: un rituel japonais depuis 500 ans
Du calme, tout le monde. Ce n’est ni la mafia, ni une punition divine.
Il s’agit d'une tradition de la ville de Chikuma, dans la préfecture de Nagano.
Chaque année, quatre hommes portant des masques de lion (qui symbolisent les divinités) se jettent volontairement la tête la première pour toucher l’eau et… laver tous les malheurs de l’année à venir. #viral
❄️ Vols annulés, arbres déracinés: Moscou frappée par une tempête de neige en plein printemps
Le Centre météorologique russe a déclaré le niveau d’alerte orange dans la capitale, en vigueur jusqu’à mardi matin.
#viral
Incendie sur une base abritant des bombardiers américains utilisés contre l'Iran
🔥 Le feu a ravagé la base britannique de RAF Fairford, "d'importance critique" pour l'Europe et l'US Air Force, rapportent les médias.
#viral
📹☀️Des "soleils jumeaux" ont illuminé le ciel de Russie
Cette couronne lumineuse qui entoure le soleil est créée par la réfraction de la lumière dans les cristaux de glace des nuages de haute altitude.
Vidéo tirée des réseaux sociaux
#viral
@grand_reequilibrage
📹Le Président mozambicain domine nettement par sa taille la Première ministre italienne dans cette vidéo devenue virale
Les internautes ont été surpris par cette différence entre Giorgia Meloni et Daniel Chapo qui éclipse les sujets de leurs discussions à Rome.
#viral
Abonnez-vous @sputnik_afrique
🔸Sputnik Afrique | X🔸
#viral | Abiy Ahmed Takes a Spin in Turkish-Made EV Gifted by Turkish President
Recep Tayyip Erdogan is currently on an official visit to Ethiopia.
Subscribe to @sputnik_africa
🔸Sputnik Africa | X🔸