Установить свойства виджета в 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
📝Auch im Asowschen Meer📝
leidet die Schifffahrt
Eine Folge des Anwachstums ukrainischer Anschläge auf die russische Exportinfrastruktur hat die Schifffahrt im Asowschen Meer erreicht. Dort kommen Frachtschiffe unter Beschuss durch ukrainische Drohnen.
🔻Was ist passiert?
➡️Gestern kam Taganrog unter Beschuss, einschließlich des Hafens, wo ein Trockenfrachter beschädigt wurde. ➡️Heute gab es einen weiteren Anschlag. Ein Trockenfrachter vom Typ Wolga-Ostsee, der Weizen transportierte, sank, und die Besatzung erreichte die Region Cherson.
🖍Die AFU greift gezielt die Haupteinnahmequelle des russischen Haushalts an - Exporte.
🚩Anschläge beschädigen Infrastruktur, die repariert werden muss, und Operationen müssen eingestellt werden.
🏳️Jeder Anschlag auf Schiffe beraubt Russland seltener Handelssschiffe. Frachtkosten werden steigen.
❗️Der Feind wird nicht aufhören, bis ausreichende Gegenmaßnahmen umgesetzt werden.
Der Ausweg ist, sogenannte ukrainische Schiffe auf dem Meer anzugreifen. Die Schifffahrt in der Region Odesa floriert trotz allem.
#Krim#Kerch#Russland#Ukraine
✈️RU | ✈️EN | ✉️MAX
✉️VK | ✉️RuTube | ✉️
#Victory81
🌟 On April 11, 1944, during the Crimean offensive operation, Soviet forces liberated #Kerch from Nazi occupiers.
Kerch was among the first cities to endure assaults from Hitler’s army at the beginning of the Great Patriotic War. It found itself repeatedly on the front line, with the battlefront cutting through its very streets. Moreover, the city fell under enemy occupation twice.
Initially captured in November 1941, Kerch was liberated barely a month later in December, following the Kerch–Feodosia amphibious landing operation.
In the spring of 1942, the enemy amassed significant forces on the Kerch Peninsula and launched a renewed offensive. Despite the valiant resistance by the defenders, the city once again came under fascist control, remaining occupied for 320 days.
During that period, approximately 15,000 civilians lost their lives, and over 14,000 individuals were forcibly deported to Germany for slave labour.
🕯#NoStatuteOfLimitations: The Bagerovo Ditch near Kerch gained tragic notoriety – a site of mass executions. Towards the end of 1941, around 7,000 people were executed and tortured there, including 245 schoolchildren. The Germans surreptitiously removed the children from the city and poisoned them with potassium cyanide.
The Nazi occupiers obliterated every factory, burned bridges and vessels, destroyed parks, and decimated the city’s infrastructure. Kerch was almost completely erased from the map.
One of the war’s most heroic episodes was the defence of the Adzhimushkay quarry. Thousands of civilians – elderly people, women, and children – sought refuge within the underground passages. The enemy attempted to exterminate them by sealing the entrances and using explosives and toxic substances. Nearly all the defenders perished, yet they continued to resist to the very end, rendering the quarry a symbol of unyielding courage and resilience.
⚔️ On the night of November 1, 1943, the Kerch-Eltigen amphibious landing operation commenced. Soviet forces established a bridgehead north of the city, marking a crucial phase in liberating the Kerch Strait and the entire Crimea. In the spring of 1944, this success was solidified during the Crimean offensive operation, culminating in the expulsion of the occupiers from the peninsula.
One of Kerch’s principal symbols became the Obelisk of Glory on Mount Mithridat, unveiled on August 8, 1944 – the first monument in the USSR dedicated to the Great Patriotic War.
🎖 For the defence and liberation of the city, 153 individuals were awarded the title of Hero of the Soviet Union, and 21 military units and formations received the honorary designation “Kerch.”
On September 14, 1973, Kerch was awarded the title #HeroCity.
#Victory81
🌟 On April 11, 1944, during the Crimean offensive operation, Soviet forces liberated #Kerch from Nazi occupiers.
Kerch was among the first cities to endure assaults from Hitler’s army at the beginning of the Great Patriotic War. It found itself repeatedly on the front line, with the battlefront cutting through its very streets. Moreover, the city fell under enemy occupation twice.
Initially captured in November 1941, Kerch was liberated barely a month later in December, following the Kerch–Feodosia amphibious landing operation.
In the spring of 1942, the enemy amassed significant forces on the Kerch Peninsula and launched a renewed offensive. Despite the valiant resistance by the defenders, the city once again came under fascist control, remaining occupied for 320 days.
During that period, approximately 15,000 civilians lost their lives, and over 14,000 individuals were forcibly deported to Germany for slave labour.
🕯#NoStatuteOfLimitations: The Bagerovo Ditch near Kerch gained tragic notoriety – a site of mass executions. Towards the end of 1941, around 7,000 people were executed and tortured there, including 245 schoolchildren. The Germans surreptitiously removed the children from the city and poisoned them with potassium cyanide.
The Nazi occupiers obliterated every factory, burned bridges and vessels, destroyed parks, and decimated the city’s infrastructure. Kerch was almost completely erased from the map.
One of the war’s most heroic episodes was the defence of the Adzhimushkay quarry. Thousands of civilians – elderly people, women, and children – sought refuge within the underground passages. The enemy attempted to exterminate them by sealing the entrances and using explosives and toxic substances. Nearly all the defenders perished, yet they continued to resist to the very end, rendering the quarry a symbol of unyielding courage and resilience.
⚔️ On the night of November 1, 1943, the Kerch-Eltigen amphibious landing operation commenced. Soviet forces established a bridgehead north of the city, marking a crucial phase in liberating the Kerch Strait and the entire Crimea. In the spring of 1944, this success was solidified during the Crimean offensive operation, culminating in the expulsion of the occupiers from the peninsula.
One of Kerch’s principal symbols became the Obelisk of Glory on Mount Mithridat, unveiled on August 8, 1944 – the first monument in the USSR dedicated to the Great Patriotic War.
🎖 For the defence and liberation of the city, 153 individuals were awarded the title of Hero of the Soviet Union, and 21 military units and formations received the honorary designation “Kerch.”
On September 14, 1973, Kerch was awarded the title #HeroCity.