products:pussy:other:dev_custom_property
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| products:pussy:other:dev_custom_property [2023/12/01 15:46] – создано ironmesh | products:pussy:other:dev_custom_property [2023/12/13 14:54] (текущий) – внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Разрабатываем класс свойства ====== | ====== Разрабатываем класс свойства ====== | ||
| - | FIXME | + | В данном уроке я расскажу как разработать собственный класс Свойства. Фреймворк уже содержит некоторое количество [[: |
| + | |||
| + | Итак, перед началом следует упомянуть несколько важных моментов: | ||
| + | |||
| + | <WRAP center round important 60%>\\ | ||
| + | Значения и параметры должны иметь данные типов, которые могут быть сериализованы с помощью модуля [[https:// | ||
| + | </ | ||
| + | |||
| + | Как вам должно быть известно Свойство это компонент, | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | На деле все предельно просто, | ||
| + | |||
| + | ===== Разработка Свойства без механизма валидации значения ===== | ||
| + | |||
| + | Опишу процесс разработки на примере уже существующего свойства [[: | ||
| + | |||
| + | Для начала создадим новый py-файл и определим новый класс, унаследованный от [[: | ||
| + | |||
| + | <code python> | ||
| + | def __init__(self, | ||
| + | self._value = default_value | ||
| + | self.p_name = name | ||
| + | self.p_tool_tip = tool_tip | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | тут все просто, | ||
| + | |||
| + | * // | ||
| + | * //name //- отображаемое имя свойства | ||
| + | * //tool_tip //- всплывающая подсказка, | ||
| + | Далее нужно переопределить метод (// | ||
| + | |||
| + | <code python> | ||
| + | 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(" | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | В методе // | ||
| + | |||
| + | Итак, ссылку на виджет мы имеем, теперь, | ||
| + | |||
| + | <code python> | ||
| + | def extract_widget_data(self) -> bool: | ||
| + | has_value_changed: | ||
| + | if hasattr(self, | ||
| + | widget_value: | ||
| + | if self._value != widget_value: | ||
| + | self._value = widget_value | ||
| + | has_value_changed = True | ||
| + | return has_value_changed | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | Для начала определям переменную // | ||
| + | |||
| + | Итак, вы только что узнали как создавать собственные свойства, | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | |||
| + | Дополнительный раз напомню, | ||
| + | |||
| + | ===== Разработка Свойства с механизмом валидации значения ===== | ||
| + | |||
| + | Здесь рассмотрим процесс разработки на примере уже существующего свойства [[: | ||
| + | |||
| + | Для начала создадим новый py-файл и определим новый класс, унаследованный от [[: | ||
| + | |||
| + | <code python> | ||
| + | class IntProperty(PropertyValidated): | ||
| + | |||
| + | def __init__(self, | ||
| + | self._set_validation(False) | ||
| + | self.p_name = name | ||
| + | self.p_minimum = minimum | ||
| + | self.p_maximum = maximum | ||
| + | self.p_single_step = single_step | ||
| + | self.p_tool_tip = tool_tip | ||
| + | self._set_validation(True) | ||
| + | self._value = default_value | ||
| + | |||
| + | def get_input_widget(self) -> QSpinBox: | ||
| + | self._widget_ref = QSpinBox() | ||
| + | self._widget_ref.setMinimum(self.p_minimum) | ||
| + | self._widget_ref.setMaximum(self.p_maximum) | ||
| + | self._widget_ref.setSingleStep(self.p_single_step) | ||
| + | self._widget_ref.setValue(self._value) | ||
| + | self.retranslate() | ||
| + | |||
| + | sizePolicy = QSizePolicy(QSizePolicy.Maximum, | ||
| + | self._widget_ref.setSizePolicy(sizePolicy) | ||
| + | |||
| + | return self._widget_ref | ||
| + | |||
| + | def extract_widget_data(self) -> bool: | ||
| + | has_value_changed: | ||
| + | if (hasattr(self, | ||
| + | self._value = self._widget_ref.value() | ||
| + | has_value_changed = True | ||
| + | return has_value_changed | ||
| + | |||
| + | def retranslate(self) -> None: | ||
| + | self._widget_ref.setToolTip(QCoreApplication.translate(" | ||
| + | |||
| + | def validate_value(self, | ||
| + | check_list = [" | ||
| + | if (changed_attr in check_list) or not changed_attr: | ||
| + | value = self._value | ||
| + | if value < | ||
| + | self.__dict__[" | ||
| + | elif value> self.p_maximum: | ||
| + | self.__dict__[" | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | Метод //_ _init_ _()// как и в прошлом случае делает тоже самое, только обратите внимание на один нюанс: в самом начале вызывается метод // | ||
| + | |||
| + | Механизм валидации устроен очень просто, | ||
| + | |||
| + | <code python> | ||
| + | def __setattr__(self, | ||
| + | self.__dict__[key] = value | ||
| + | |||
| + | if self._do_validation: | ||
| + | self.validate_value(key) | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | Здесь как обычно производится присвоение полю значения , затем выполняется вызов метода // | ||
| + | |||
| + | Методы // | ||
| + | |||
| + | Для свойств данного типа нужно определить важный метод // | ||
| + | |||
| + | Ну, вот и все, урок по разработке собственного класса свойства подошел к концу, как вы могли убедиться это очень простой процесс, | ||
products/pussy/other/dev_custom_property.1701434819.txt.gz · Последнее изменение: (внешнее изменение)