Установить свойства виджета в 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
Under Hon'ble PM Shri #NarendraModi ji's leadership, to strengthen #education sector, budget allocation in Padhna Likhna Abhiyan is increased from Rs. 95.25 crore to Rs. 250 crore in BE 2021-22 (an increase of Rs. 154.75 crore) i.e. by 162.47%. 👌 Join @OnlineEducation10
बीते 9 वर्षों में माननीय प्रधानमंत्री #NarendraModi के नेतृत्व में केंद्र सरकार द्वारा विभिन्न क्षेत्रों में हुई अविश्वसनीय उपलब्धियों को जानने हेतु अभी विजिट करेः https://9years.mygov.in/
#9YearsOfSeva
संयुक्त राज्य अमेरिका की पीएम मोदी की राजकीय यात्रा का एक महत्वपूर्ण क्षण।
वाशिंगटन डीसी के ज्वाइंट बेस एंड्रयूज में माननीय प्रधानमंत्री #NarendraModi का भव्य स्वागत।
अभी देखें: https://youtu.be/EhWY2Ssl2ws
#PMModiUSVisit
मेरे साथी YouTubers।। 🎙️
प्रधानमंत्री #NarendraModi ने यूट्यूब #FanFest कार्यक्रम को संबोधित किया और देश के सभी कोनों से जुटे कॉन्टेंट क्रिएटर्स से वे जुड़े।
आइए सुनें...
#MannKiBaat के 30 जुलाई 2023 के एपिसोड के लिए #AatmanirbharBharat के निर्माण से जुड़ी अपनी प्रेरक कहानी माननीय प्रधानमंत्री #NarendraModi के साथ शेयर करें!
अपना सुझाव भेजने के लिए 1800-11-7800 डायल करें या विजिट करेंः https://www.mygov.in/group-issue/inviting-ideas-mann-ki-baat-prime-minister-narendra-modi-30th-july-2023/
#NewIndia
#MyGov
बीते 9 वर्षों में पीएम #NarendraModi के नेतृत्व में केन्द्र सरकार के अथक प्रयासों ने भारत की समृद्ध सांस्कृतिक विरासत को विश्न में एक नई पहचान देने का काम किया है।
आइए देखें एक झलक...
विजिट करेंः https://youtu.be/scGbw2m8ook
#9YearsOfPreservingCulture
#9YearsOfSeva
Honorable Prime Minister #NarendraModi leadership has transformed #DigitalIndia. With a simple click, everything became possible. From digital identities to widespread connectivity, India is scripting a golden chapter of its digital revolution. Check out the video showcasing this remarkable growth.
Visit Now: https://youtu.be/7y2qLEZlOcQ
#8YearsOfDigitalIndia
Attention, fellow citizens!
Your stories and ideas can create a wave of inspiration! Share them with Honorable Prime Minister #NarendraModi for #MannKiBaat, a platform where your voice truly matters.
Visit: https://www.mygov.in/group-issue/inviting-ideas-mann-ki-baat-prime-minister-narendra-modi-30th-july-2023/
#NewIndia
#MKB
Honorable Prime Minister #NarendraModi receives a grand ceremonial welcome at Joint Base Andrews, Washington DC. On a state visit to the USA, invited by President Joseph Biden and First Lady Dr Jill Biden, this marks a significant moment for India-USA ties. A warm embrace of diplomacy and friendship!
Visit Now: https://youtu.be/EhWY2Ssl2ws
#ModiInUSA#IndoUSRelations#PMModiUSVisit
Did you know?
Honorable Prime Minister #NarendraModi is the first Indian PM to
address the US Congress twice!
Here are some standout aspects of his upcoming visit to the USA.
#ModiInUSA#IndoUSRelations#PMModiUSVisit
क्या आप जानते है?
माननीय प्रधानमंत्री #NarendraModi अमेरिकी कांग्रेस को दो बार संबोधित करने वाले पहले भारतीय प्रधानमंत्री होंगे।
#ModiInUSA#IndoUSRelations
#PMModiUSVisit
My Fellow YouTubers!
PM #NarendraModi had a special engagement today as he addressed the YouTube #FanFest event, connecting with #content creators from all corners of the country.
Do listen in!
#ContentCreators