products:pussy:other:dev_custom_property
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:pussy:other:dev_custom_property [2023/12/08 15:05] – ironmesh | products:pussy:other:dev_custom_property [2023/12/13 14:54] (текущий) – внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Разрабатываем класс свойства ====== | ====== Разрабатываем класс свойства ====== | ||
| - | |||
| - | FIXME | ||
| В данном уроке я расскажу как разработать собственный класс Свойства. Фреймворк уже содержит некоторое количество [[: | В данном уроке я расскажу как разработать собственный класс Свойства. Фреймворк уже содержит некоторое количество [[: | ||
| - | Итак, перед началом следует упомянуть несколько важных моментов. Значения и параметры должны иметь такие типы, которые могут быть сериализованы с помощью модуля [[https:// | + | Итак, перед началом следует упомянуть несколько важных моментов: значения и параметры |
| <WRAP center round important 60%>\\ | <WRAP center round important 60%>\\ | ||
| Строка 11: | Строка 9: | ||
| </ | </ | ||
| - | Как вам должно быть известно Свойство это компонент, | + | Как вам должно быть известно Свойство это компонент, |
| * [[http:// | * [[http:// | ||
| Строка 17: | Строка 15: | ||
| * [[http:// | * [[http:// | ||
| * [[http:// | * [[http:// | ||
| - | * [[http:// | + | * [[http:// |
| На деле все предельно просто, | На деле все предельно просто, | ||
| Строка 25: | Строка 23: | ||
| Опишу процесс разработки на примере уже существующего свойства [[: | Опишу процесс разработки на примере уже существующего свойства [[: | ||
| - | Для начала создать новый py-файл и определить новый класс, унаследованный от [[: | + | Для начала создадим |
| <code python> | <code python> | ||
| Строка 32: | Строка 30: | ||
| self.p_name = name | self.p_name = name | ||
| self.p_tool_tip = tool_tip | self.p_tool_tip = tool_tip | ||
| + | |||
| </ | </ | ||
| - | тут все просто, | + | тут все просто, |
| - | Далее нужно переопределить метод (// | + | * // |
| + | * //name //- отображаемое имя свойства | ||
| + | * //tool_tip //- всплывающая подсказка, | ||
| + | Далее нужно переопределить метод (// | ||
| <code python> | <code python> | ||
| Строка 48: | Строка 50: | ||
| def retranslate(self) -> None: | def retranslate(self) -> None: | ||
| self._widget_ref.setToolTip(QCoreApplication.translate(" | self._widget_ref.setToolTip(QCoreApplication.translate(" | ||
| + | |||
| </ | </ | ||
| - | В методе // | + | В методе // |
| - | Итак, ссылку на виджет мы имеем, теперь, | + | Итак, ссылку на виджет мы имеем, теперь, |
| <code python> | <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: | def extract_widget_data(self) -> bool: | ||
| has_value_changed: | has_value_changed: | ||
| - | | + | if (hasattr(self, |
| - | | + | self._value = self._widget_ref.value() |
| - | self._value = widget_value | + | |
| has_value_changed = True | has_value_changed = True | ||
| return has_value_changed | 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.1702037153.txt.gz · Последнее изменение: (внешнее изменение)