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

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


products:pussy:other:dev_propertycontainer_gui

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


Разработка интерфейса для Контейнера Свойств

FIXME

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

Дефолтный интерфейс Контейнера свойствПодробнее о концепции свойств читайте здесь.

Ставим задачу

Для начала разберемся с тем, что мы хотим получить. Допустим у нас есть перечень свойств, которые имеют имена с суфиксами _s1,_s2…_s5, зная этот факт я хочу сгруппировать их все в пяти секциях, для этого я выберу виджет, который позволяет разделять макет на страницы, к примеру, возьмем QToolBox, далее на каждой странице будут собраны свойства, имена которых будут иметь суффикс «_sX», форма страниц будет аналогичная той, которую имеет дефолтный интерфейс: в поле с полосой прокрутки (QScrollArea) будут собраны свойства в макете-форме (QFormLayout), где в левом столбце будут виджеты 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() нужно вызвать, чтобы свойства были созданы. Теперь, можно посмотреть как будет выглядеть дефолтная форма с сгенерированными свойствами

def_propcontainer_gui_1.jpgвыглядит она не очень презентабельно, тут собрано порядка 500 свойств, пользователю было бы непросто здесь разобраться. Напомню, что имя свойства определяет, на какую страницу оно попадет, то есть свойства с префиксом «_s1» попадают на первую страницу, с «_s2» на вторую и так далее. Давайте в

Ну, вот и все, урок по разработке собственного класса свойства подошел к концу, как вы могли убедиться это очень простой процесс, который не займет много времени и сил, но перед использованием не забывайте тестировать свой код. Если что-то не понятно, то можно задать вопрос в Discord.

products/pussy/other/dev_propertycontainer_gui.1702128890.txt.gz · Последнее изменение: (внешнее изменение)