Установить свойства виджета в 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
GM OneEarth community, it's been a while! 🎆
Venue:X Space
Special Guest:@MissWRosa@woxiangni1997
🗓 May 15th 10 PM UTC+9
💰$100 #Giveaways👇
1️⃣Join the Bot :OneEarth Bot
2️⃣ Ask questions in Comment
3️⃣ Like & RT
Remember: One Earth, One Community! 🌎⚡️
✨ Giveaway: Creative Ways to Hide Your Tangem Wallet
🥳Our Discord Community Turns 1!
Celebrate with us by showing off your creativity in our special anniversary giveaway!
Are you a master of concealment? We’re challenging you to come up with the most fun hiding places for your Tangem Wallet. Whether it’s hidden in a book on your shelf or tucked behind a secret panel, we want to hear your best ideas!
🏆 5 Tangem branded Hoodies to be won on Discord in the #giveaways channel
👀 How to Enter:
Share your creative hiding spots in the #giveaways thread → top ideas, as voted by our community members, will win.
📅 Dates: Enter until the 28th June → 1st July we do a community vote → then we share the winners!
Cheers to the next year of the Tangem Community - to health, stealth, and wealth!
👾Join Discord and take part in contest →https://discord.com/invite/tangem
📰You can make your payment via @Premiumbot or Fragment to activate Giveaways
Currently, because this service is not ready, you'll receive ACCESS_DENIED message from the bot.
#Giveaways
👉The TG Times
📰Win Telegram Premium
By having all the conditions to receive Telegram Premium Gift from the channels, among the participants in this Giveaway, the desired number will be randomly selected to receive this gift.
After winning, a message containing the link to activate this subscription will be sent to you via Telegram.
You can also share this link with your friends so that they can get this subscription.
#Giveaways
👉The TG Times
📰New options for Giveaways
You can enable Additional Prizes if you want to give the winners your own prizes in addition to Premium subscription.
Also you can choose whether to make the list of winners public when the Giveaway ends.
#Giveaways | #Beta v.10.4
👉The TG Times
📰Giveaway Prizes
Giveaway Premium subscriptions to your channel members
Telegram is launching a new system to upgrade channels, where channel admins can create Premium Giveaways and set conditions such as location and date for them and boost their channels in this way.
This system is not yet fully available and can only be accessed on the test server.
Giveaway sources: @betawatch
#Giveaways | #Beta v.10.2
👉The TG Times
📰Giveaways are getting ready to be activated on the main server
Telegram beta configuration updates in each version make the Giveaways more complete and prepare for official presentation.
This system was active for some to receive more boosts from the first release of the beta version 10.2.0 on the test server.
Also, multiple boosts and the possibility of boosting more by giving a Premium gift are not activated on the main server, which can be related to the Giveaways.
It is expected that this system will be launched soon in the next updates for the main server.
Configurations by @tgcrawl
#Giveaways | #Configuration
👉The TG Times
Tonnel Network: New Measures Against Bot Farms in Giveaways
#giveaways#restrictions
Tonnel Network has enhanced measures to combat bot farms that manage to bypass restrictions in giveaways. Channel owners are encouraged to set at least one restriction to ensure the integrity of their free giveaways.
Source: link
@tonlines