Установить свойства виджета в 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
🖼 Trending now: #CryptoIntegration – JPMorgan to accept Bitcoin and Ether as collateral for institutional clients. #BTC#ETH#JPMorgan
💰 摩根大通(JPMorgan Chase & Co.)計劃允許機構客戶使用比特幣與以太坊作為抵押資產,標誌著傳統金融與加密市場邁向更深層的融合。
被視為華爾街擁抱加密資產的重要一步,或將推動主流金融進一步開放區塊鏈應用。 #Insight#Web3#Blockchain
@EthereumGlobalNews Follow for more global Web3 & DeFi updates!
🚀 Securitize Integrates Tokenized Assets with TRON Network
Securitize, a platform specializing in the tokenization of real-world assets (RWA), has announced its integration with the TRON network. According to Foresight News, this development enables Securitize to introduce its tokenized funds and securities onto the TRON blockchain. This integration marks a significant step in expanding the accessibility and functionality of tokenized assets within the blockchain ecosystem.
#Securitize#Tokenization#TRON#Blockchain#RWA#DigitalAssets#CryptoIntegration#TRX
#BlockchainBridges#DeFiExplained#CryptoIntegration#Web3Tools#мост#база
Что такое мосты в блокчейне и зачем они нужны?
Мосты (bridges) в криптомире — это технологии, которые позволяют перемещать активы или данные между разными блокчейнами. Например, представь, что у тебя есть токены на Binance Smart Chain (BSC), но ты хочешь использовать их на Ethereum. Так как сети не могут взаимодействовать напрямую, мост берёт на себя функцию "проводника", переводя активы с одной сети на другую.
❓Как это работает?
Когда ты используешь мост, токены блокируются на одной сети (например, на BSC), а на другой сети (Ethereum) создаётся их "обёртка" (wrapped) — аналог в нужной сети. Этот процесс напоминает перемещение денег между банками: они не физически переходят, но система фиксирует изменения на обеих сторонах. Когда тебе понадобится обратно перевести токены, обратный процесс снимет "обёртку" и разблокирует твои оригинальные активы.
📌Пример
Представь, что у тебя есть токены USDT на сети BSC, и ты хочешь использовать их в приложении DeFi на Ethereum. Мост "заблокирует" эти USDT на BSC и создаст эквивалент на Ethereum, например, wrapped USDT (WUSDT). Эти WUSDT можно будет использовать так же, как обычные USDT, но уже на другой сети.
❗️ Мосты улучшают взаимодействие блокчейнов и позволяют гибко перемещать активы между разными экосистемами. Однако, учти, что этот процесс может занимать некоторое время, так что надо быть готовым подождать несколько минут.
⏩
❗️Ставьте лайки и подписывайтесь на наш канал, чтобы узнавать больше о мире блокчейн и криптовалют!
@MirraChannel😎