Установить свойства виджета в 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
Apple宣布首席运营官职位交接
Apple 今日 宣布 ,首席运营官 Jeff Williams 将于本月晚些时候正式交接其职责,由现任运营高级副总裁 Sabih Khan 接任。这是公司早已规划好的继任安排。Jeff Williams 仍将继续向 Apple CEO Tim Cook 汇报工作,负责领导 Apple 的顶级设计团队以及 Apple Watch 和健康相关项目。在 Williams 计划于今年晚些时候退休后,Apple 的设计团队将直接向 Tim Cook 汇报。
在 Apple 任职期间,Jeff Williams 建立并完善了全球供应链,支持了 Apple 在全球范围内的业务拓展,包括美国、中国、印度、日本及整个东南亚地区。他还主导了供应商责任工作,为全球员工提供培训和教育项目,提高行业标准。Williams 是 iPod 和 iPhone 项目的关键推动者。他十多年前着手推动 Apple Watch 的开发,并构建了 Apple 的健康战略,帮助用户过上更健康的生活,更好地了解自身健康并获得关键的医疗支持。近年来,他还一直领导 Apple 的顶级设计团队。
#AppleNewsroom
📮 频道 @AppPie
隆重推出 Apple Sports,一款专为体育迷打造的新应用
🔗Apple Newsroom
Apple 今天推出了 Apple Sports,这是一款适用于 iPhone 的免费应用程序,它为体育迷们提供实时比分、统计数据等信息。该应用以速度和简便性为设计宗旨,为用户提供了个性化体验,将他们最喜爱的联赛和球队放在了显著位置,且拥有 Apple 设计的易用界面。Apple Sports 现在已经可以在美国、英国和加拿大的 App Store 中下载。
#AppleNewsroom
📮 频道 @AppPie
Apple 在 iPhone 15 Pro 上推出拍摄空间视频的功能
🔗Apple Newsroom (中国大陆)
更新至 iOS 17.2 后,iPhone 15 Pro 和 iPhone 15 Pro Max 用户现在即可开始录制空间视频——利用这项开创性的全新功能捕捉生活中的宝贵时刻 —— 稍后在 Apple Vision Pro 上重温这些暖心回忆。
#AppleNewsroom
📮 频道 @AppPie
Mac 与 iPad 版 Final Cut Pro 迎来重大升级
🔗Apple Newsroom (中国大陆)
Apple 今日宣布对 Mac 与 iPad 版 Final Cut Pro 进行升级,带来简化工作流的强大新功能。Final Cut Pro 改进时间线导览与归整体验,同时新增简化复杂编辑的新方式。这两个版本的 app 利用 Apple 芯片的强大能效表现,推出对象跟踪器的全新机器学习模型,搭载多个媒体处理引擎的 Mac 机型导出速度大幅提升。iPad 版 Final Cut Pro 推出新功能,进一步提升便携多点触控编辑体验,包括旁白录音功能、扩展的 app 内内容选项、新增调色预设与工作流提升等。上述 Final Cut Pro 更新将于本月晚些时候在 App Store 推出。
#AppleNewsroom
📮 频道 @AppPie