Это старая версия документа!
Разработка интерфейса для Контейнера Свойств
В данном уроке я расскажу как разработать альтернативный интерфейс для Контейнера свойств, по умолчанию он генерирует интерфейс единым списком без группировки, если свойств немного, то этого будет вполне достаточно, но если их десятки или даже больше сотни, то таким интерфейсом будет пользоваться не слишком удобно, также может возникнуть желание добавить дополнительные функции, например, сортировка или фильтр и т.п. Ниже показана предопределенная форма
Подробнее о концепции свойств читайте здесь.
(описать здесь задачу)
Ставим задачу
Для начала разберемся с тем, что мы хотим получить. Допустим у нас есть перечень свойств, которые имеют имена с суфиксами _s1,_s2…_s5, зная этот факт я хочу сгруппировать их все в пяти секциях, для этого я выберу виджет, который позволяет разделять макет на страницы, к примеру, возьмем QToolBox, далее на каждой странице будут собраны свойства, имена которых будут иметь суффикс «_sX», форма страниц будет аналогичная той, которую имеет дефолтный интерфейс: в поле с полосой прокрутки (QScrollArea) будут собраны свойства в макете-сетке (QGridLayout), где в левом столбце будут виджеты QLable с именами свойст, а в правом виджеты самих свойств.
Решаем задачу
Приступим к разработке, для теста я создам новый Плагин (о разработке плагинов читайте в материале Быстрый старт), чтобы можно было легко наблюдать результат проделанной работы. В файле MySettings.py есть класс с тем же названием, удалим определение одного свойства и вместо ручного ввода, пожалуй, я сделаю метод, который заполнит класс свойствами автоматически, поскольку, все нам известно, что они должны храниться в поле _ _annotations_ _. Вот код файла, который у меня получился
from PySide6.QtWidgets import QWidget,QFormLayout, QLabel, QScrollArea, QToolBox from PySide6.QtCore import Qt, QCoreApplication from PyUB.Types import PropertyContainer from PyUB.Types.Properties import * class MySettings(PropertyContainer): @classmethod def generate_properties(cls) -> None: for i in range(1, 101): cls.__annotations__[f"int_property{i}_s1"] = IntProperty(default_value=i, name=f"Int Property {i}", maximum=1000) cls.__annotations__[f"float_property{i}_s2"] = FloatProperty(default_value=float(i), name=f"Float Property {i}",maximum=1000) cls.__annotations__[f"string_property{i}_s3"] = StringProperty(default_value=f"Just String {i}", name=f"String Property {i}") cls.__annotations__[f"bool_property{i}_s4"] = BoolProperty(default_value=True, name=f"Bool Property {i}") cls.__annotations__[f"combobox_property{i}_s5"] = ComboBoxProperty(default_value=0, name=f"Combobox Property {i}", items=["item1", "item2"]) MySettings.generate_properties()
заметьте, что после определения класса метод generate_properties() нужно вызвать, чтобы свойства были созданы. Теперь, можно посмотреть как будет выглядеть дефолтная форма с сгенерированными свойствами
выглядит она не очень презентабельно, тут собрано порядка 500 свойств, пользователю будет непросто. Здесь
Ну, вот и все, урок по разработке собственного класса свойства подошел к концу, как вы могли убедиться это очень простой процесс, который не займет много времени и сил, но перед использованием не забывайте тестировать свой код. Если что-то не понятно, то можно задать вопрос в Discord.