Установить свойства виджета в 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
Breaking: A Boeing 737 plane that plummeted into a Chinese hillside in 2022, killing all 132 people on board, had its fuel supply cut mid-flight, according to newly released data by the US National Transportation Safety Board (NTSB).
Findings by the NTSB say that the fuel switches on both engines of the China Eastern flight were moved to the "cut-off" position while it was at a cruising altitude of 8,839m (29,000ft) — exactly like the AI171 Air India crash in Gujarat last year.
China has yet to release a final report on the incident, citing national security concerns. #Aviation
BBC Article
GPS Renewables started construction on India's first Ethanol-to-Jet (ETJ) Sustainable Aviation Fuel (SAF) plant in Pudimadaka, Andhra Pradesh, under an NTPC Green Energy EPC contract. Using Lummus Technology and Xytel India's engineering, the facility at NTPC's Green Hydrogen Hub will produce 1,800 tonnes per annum of SAF and renewable diesel. The process converts CO2-derived ethanol via ethylene conversion, oligomerisation, and hydroprocessing. This project advances India's sustainable aviation fuel scaling and transport sector decarbonization goals.
Source
#Aviation
India is redefining the rules of the game with its upcoming airport privatisation plans, aiming to curb monopolistic tendencies in the aviation sector. The govt is laying down new ground rules to promote a healthy competitive environment.
Source
#Aviation
IndiGo resumes direct India–China flights with Delhi–Guangzhou service; first landing on Apr 28 restores connectivity after ~4–5 year gap. Airline operates daily routes using A320 aircraft, expanding to Shanghai and Kolkata routes with ~21 weekly departures.
#Aviation
https://t.co/3nGRpvMboR
🛠️ AIESL plans to expand the Nagpur aviation maintenance facility into a major MRO hub.
📍 The company is seeking EASA certification to service Airbus aircraft for global airlines.
✈️ The site has already completed 240+ maintenance checks on Boeing and Airbus fleets.
#Aviation
https://t.co/GosIlxNf56
Embassy of France in India
"With effect from 10 April 2026, Indian nationals possessing an ordinary passport are no longer required to hold an airport transit visa when passing through the international zone of airports located on French territory. This measure applies to passengers remaining in the international zone during a layover at a French airport en route to a third country."
#Aviation
✈️ India's newest regional airline Star Air will launch 38 weekly flights to Mundra from 25 April.
🌐 Direct links to Mumbai, Hindon, Goa (Mopa) & Surat plus one-stop routes.
🪑 Adds 4,100+ weekly seats, boosting regional connectivity.
#Aviation
https://t.co/0Ys3hXULvs