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

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


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» на вторую и так далее. У PropertyContainer за вывод интерфейса отвечает метод render_layout() , а метод retranslate() отвечает за перевод отображаемой информации, Менеджер автоматически вызывает данные методы, поэтому retranslate() не нужно вызывать в коде, как это делается в Свойствах. Если перевод не нужен, то заполнение интерефейса можно произвести в методе render_layout(), а в методе retranslate() вписать ключевое слово pass.

Итак, в итоге у меня получился следующий код для методов render_layout() и retranslate()

(вставить сюда код FIXME )

А вот так выглядит новый интерфейс, уже намного лучше. Это только один из вариант группировки свойств по разделам, также можно для таких целей использовать виджеты: QTabWidget, QStackedWidget совместно с виджетом для выбора элементов, например, QListWidget, QComboBox и другие.def_propcontainer_gui_2.jpgНу, вот и все, урок по разработке альтернативного интерфейса для Контейнера свойств подошел к концу, как вы могли убедиться это очень простой процесс, который не займет много времени и сил, при наличии опыта разработки интерфейсов, если опыта мало, то можно сверстать его в QtDesigner, а затем посмотреть как устроен код и перенести его в свой проект с некоторыми изменениями, и перед использованием не забывайте тестировать свой код. Если что-то не понятно, то можно задать вопрос в Discord.

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