Установить свойства виджета в 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
#from#building
A series of immersive geodesic dome glamping sites, each featuring a panoramic window composed of precisely 16 equilateral triangles on the front facade. Nestled in a lush rainforest, the domes measure 6 meters in diameter and 3.5 meters in height. The transparent panoramic window provides an uninterrupted view of towering trees, vibrant flora, and the gentle trickle of a nearby waterfall. The photo captures the integration of the dome structures within the dense foliage, with the panoramic windows acting as portals into the enchanting forest. Sunlight filters through the canopy, creating a mesmerizing interplay of light and shadow within the domes. The overall ambiance is one of tranquility and harmony with nature, enticing visitors to embark on a serene glamping experience amidst the rainforest's embrace. Photography, mirrorless camera with a prime lens to capture the intricate details of the rainforest, --ar 16:9
✅ Revive Homes _Discord
@ai_artz
#from#building
A city of circular houses and community centers made out of grafted willow trees, recycled materials, and biomaterials; humans and animals coexisting amongst lush greenery and abounding nature without the presence of industrial materials
✅ nlynch00 _Discord
@ai_artz
#from#building
Floating House Visualization Amphibious design, flood-resilient construction, modular living spaces, energy-efficient technologies, solar panels, bold color accents, sustainable materials, adaptable to rising water levels, dimensions: 12m (L) x 8m (W) x 6m (H) --v 5
✅ Ahmet Ç _Discord
@ai_artz🌿
#from#building
An interior view of a Burger QSR featuring blue, orange, and white accents throughout the space. The seating area is decorated with a mix of comfortable chairs and booths, while the walls are adorned with abstract art and geometric patterns. The lighting fixtures create a warm and inviting atmosphere, complementing the vibrant color palette and fostering a sense of community.
✅ rajivkk _Discord
@ai_artz