Инструменты пользователя

Инструменты сайта


products:pussy:other:dev_custom_property

Это старая версия документа!


Разрабатываем класс свойства

FIXME

В данном уроке я расскажу как разработать собственный класс Свойства. Фреймворк уже содержит некоторое количество готовых свойств, но в в определенных случаях этого может быть недостаточно, подробнее о концепции свойств читайте здесь.

Итак, перед началом следует упомянуть несколько важных моментов. Значения и параметры должны иметь такие типы, которые могут быть сериализованы с помощью модуля pickle, чтобы Менеджер мог сохранить их в базе данных, в противном случае это может привести к непредскажуемым результатам, вероятнее всего Менеджер просто не сможет сохранить данные.


Значения и параметры должны иметь данные типов, которые могут быть сериализованы с помощью модуля pickle.

Как вам должно быть известно Свойство это компонент, предназначеный для хранения и отображения данных. Свойства делятся на 2 типа: с валидацией значения по заданным параметрам и без валидации, во всех случая нужно переопределить следующие методы:

На деле все предельно просто, следуйте всем рекомендациям, чтобы получить рабочий класс Свойства, который будет работать без конфликтов с другими компонентами системы.

Разработка Свойства без механизма валидации значения

Опишу процесс разработки на примере уже существующего свойства BoolProperty, оно очень просто устроено и служит для хранения одного булевого значения.

Для начала создать новый py-файл и определить новый класс, унаследованный от Property. Пришло время переопределить методы, код метода _ _init()_ _() приведен ниже

 def __init__(self, default_value:bool=False, name="Unnamed", tool_tip=""):
        self._value = default_value
        self.p_name = name
        self.p_tool_tip = tool_tip

тут все просто, здесь мы задаем начальное значение свойства и устанавливаем его параметры. Значение свойства должно храниться в поле _value, если отступить от этого правила, то придется переопределять методы value() и set_value(). Имена полей параметров должны начинаться с префикса p_, отступление от этого правила вынудит переопределять методы get_parameters_dict() и set_parameters_from_dict(). Имя свойства должно храниться в поле p_name, в противном случае будет необходимо переопределить метод get_name().

Далее нужно переопределить метод (get_input_widget()), который будет возвращать виджет для редактирования значения, в нашем случае отлично подходит существующий виджет QCheckBox, также переопределим вспомогательный метод retranslate(), их код приведен ниже

    def get_input_widget(self) -> QCheckBox:
        self._widget_ref = QCheckBox()
        self._widget_ref.setCheckState(Qt.Checked if self._value else Qt.Unchecked)
        self.retranslate()
        return self._widget_ref
 
    def retranslate(self) -> None:
        self._widget_ref.setToolTip(QCoreApplication.translate("properties", self.p_tool_tip))

В методе get_input_widget() создается экземпляр виджета и сохраняется в поле _widget_ref, у виджета устанавливается состояние согласно тому, что установлено в значении; в методе retranslate() производится установка всплывающей подсказки, тут производится поиск перевода в установленных словарях в контексте properties, в этом методе следует производит все установки отображаемых данных, которым требуется перевод, так как пользователь может на лету производить переключение языка интерфейса; в конце метод должен вернуть ссылку на виджет.

Итак, ссылку на виджет мы имеем, теперь, нам нужно обновить это значение, все правильно, значение свойства синхронизируется с виджетом по запросу, а не при изменении, эту работу выполняет метод extract_widget_data(), его задача извлечь данные из виджета из записать их внутрб свойства, также он должен уведомить о том, что значение было изменено.

    def extract_widget_data(self) -> bool:
        has_value_changed: bool = False
        widget_value: bool = self._widget_ref.checkState() == Qt.Checked
        if hasattr(self, "_widget_ref") and self._value != widget_value:
            self._value = widget_value
            has_value_changed = True
        return has_value_changed
products/pussy/other/dev_custom_property.1702037153.txt.gz · Последнее изменение: (внешнее изменение)