Установить свойства виджета в 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
#LUNC/USDT analysis :
#LUNC is currently in a downtrend, forming lower lows (LLs) and lower highs (LHs) below the 200 EMA. The price has retraced to the 200 EMA and the resistance zone. It is anticipated that the price will continue its bearish momentum and test lower levels.
TF : 1D
Entry : $0.00008532
Target : $0.00006396
SL : $0.00011356
#LUNC/USDT analysis :
#LUNC is presently in a downtrend, trading below the 200 EMA. The price is facing resistance in the current zone, suggesting a possible reversal point. It is expected that the price will reverse from this resistance area and continue its bearish path, potentially revisiting previous low levels.
TF : 2h
Entry : $0.0000765
Target : $0.0000713
SL : $0.0000788
#LUNC/USDT analysis :
#LUNC is currently experiencing a downtrend, trading below the 200 Exponential Moving Average (EMA). The price is encountering resistance in the current zone, indicating a potential reversal point. It is anticipated that the price will reverse from this resistance area and persist in its bearish trajectory, likely retesting prior low levels.
TF : 30min
Entry : $0.0000764
Target : $0.0000716
SL : $0.0000793
#LUNC/USDT analysis :
#LUNC has experienced a breakout followed by a retest of the resistance zone, which has now transformed into a support zone. It is anticipated that the price will receive support at this level, leading to a potential upward movement to sustain its bullish trend and challenge the previous peak.
TF : 4h
Entry : $0.0000835
Target : $0.0000948
SL : $0.0000785
💰#LUNC reached -Order block zone on Daily Time frame,we need breakup from this area to continue the pump and reach the target price zone (0.0005) otherwise will have a correction until the + order block (the Green zone)✅
❄️@signals_bitcoin_crypto❄️
❄️@Shadow_support0o❄️
💰#LUNC broken up the falling wedge pattern on 12H Time frame,also pullback confirmed,we can buy some lunc here🐋
❄️@signals_bitcoin_crypto❄️
❄️@Shadow_support0o❄️
💰#LUNC rejected from the Trendline on 4H Time frame,we are waiting to see the price reaction to the Support zone..⏳
❄️@signals_bitcoin_crypto❄️
❄️@Shadow_support0o❄️