Установить свойства виджета в 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
📌Как создавали RL-агент AutoGLM-OS, который выбил SOTA на OSWorld, обогнав OpenAI и Anthropic.
Автономные агенты, способные управлять рабочим столом - это Грааль современного HCI. Но их обучение сопряжено с трудностями: GUI созданы для людей, а не для машин, а масштабирование RL упирается в неэффективность и нестабильность сред.
В Z.ai сделали фреймворк COMPUTERRL, который лег в основу агента AutoGLM-OS. Результат - state-of-the-art на бенчмарке OSWorld: 48.1% успешных выполнений и это лучше, чем у OpenAI CUA 03 (42.9%), UI-TARS-1.5 (42.5%) и Claude 4.0 Sonnet (30.7%).
OSWorld — это крупный бенчмарк из 369 заданий для проверки многомодальных ИИ-агентов в реальных условиях. Он работает в Ubuntu, Windows и macOS.
В нем ИИ выполняет открытые задачи: работает с веб- и десктопными приложениями, управляет файлами, запускает процессы. Каждое задание имеет четкие начальные условия и скрипты для оценки, чтобы результаты можно было воспроизвести.
Такие высокие показатели - результат комбинации 3-х инноваций.
🟡Новая парадигма взаимодействия API-GUI.
Фреймворк объединяет GUI-взаимодействия с быстрыми и точными API-вызовами образуя систему, которая через LLM автоматически анализирует примеры задач, генерирует необходимый API-код для стандартных приложений Ubuntu и даже создает для него базовые тесты.
Таким образом, агент использует быстрые API там, где это возможно, и переключается на GUI для общих задач, что повышает и скорость, и надежность. Абляция показала, что переход от GUI-only к API-GUI поднимает средний показатель успеха с 11.2% до 26.2%.
🟡Масштабируемая распределенная RL-инфраструктура.
OSWorld крайне ресурсоемок, и запуск множества его экземпляров на одном узле это тот еще квест. Z.ai полностью переработали эту среду, используя qemu-in-docker для легковесного развертывания VM, gRPC для связи между узлами и полностью асинхронный фреймворк AgentRL. Это позволило создать кластер из тысяч параллельных виртуальных сред, к котором онлайн-обучение RL-агентов стало максимально эффективным.
🟡Стратегия обучения Entropulse.
Entropulse решает проблему коллапса энтропии, чередуя фазы RL с периодическими сессиями SFT. Во время RL-фазы собираются все успешные траектории, и на их основе формируется новый SFT-датасет. Затем модель дообучается на этом датасете, что позволяет восстановить её исследовательскую способность без потери производительности. После этого запускается вторая, более эффективная фаза RL.
Эта стратегия позволила AutoGLM-OS, построенному на базе 9B GLM-4, достичь финального результата в 48.1%, в то время как после первой RL-фазы показатель был 42.0%.
🟡Arxiv
@ai_machinelearning_big_data
#AI#ML#Agents#AutoGLM#Zai