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

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


products:pussy:other:dev_propertycontainer_gui

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:pussy:other:dev_propertycontainer_gui [2023/12/12 03:55] – [искусственный разграничитель удалить!] ironmeshproducts:pussy:other:dev_propertycontainer_gui [2023/12/13 14:54] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 ====== Разработка интерфейса для Контейнера Свойств ====== ====== Разработка интерфейса для Контейнера Свойств ======
  
-FIXME 
  
 В данном уроке я расскажу как разработать альтернативный интерфейс для [[:products:pussy:concepts:propertycontainer|Контейнера свойств]], по умолчанию он генерирует интерфейс единым списком без группировки по разделам и прочего, если свойств немного, то этого будет вполне достаточно, но если их десятки или даже сотни, то таким интерфейсом будет пользоваться не слишком удобно, также может возникнуть желание добавить дополнительные функции, например, сортировка, фильтр и т.п. Ниже показана предопределенная форма вывода свойств В данном уроке я расскажу как разработать альтернативный интерфейс для [[:products:pussy:concepts:propertycontainer|Контейнера свойств]], по умолчанию он генерирует интерфейс единым списком без группировки по разделам и прочего, если свойств немного, то этого будет вполне достаточно, но если их десятки или даже сотни, то таким интерфейсом будет пользоваться не слишком удобно, также может возникнуть желание добавить дополнительные функции, например, сортировка, фильтр и т.п. Ниже показана предопределенная форма вывода свойств
Строка 37: Строка 36:
 </code> </code>
  
-===== искусственный разграничитель удалить! ===== 
  
 заметьте, что после определения класса метод //generate_properties()// нужно вызвать, чтобы свойства были созданы. Теперь, можно посмотреть как будет выглядеть дефолтная форма с сгенерированными свойствами заметьте, что после определения класса метод //generate_properties()// нужно вызвать, чтобы свойства были созданы. Теперь, можно посмотреть как будет выглядеть дефолтная форма с сгенерированными свойствами
Строка 47: Строка 45:
 Итак, в итоге у меня получился следующий код для методов// render_layout() // и// retranslate()// Итак, в итоге у меня получился следующий код для методов// render_layout() // и// retranslate()//
  
-//(вставить сюда код FIXME )//+ 
 +<code python> 
 +@classmethod 
 +    def render_layout(cls-> QToolBox: 
 +        cls._lable_list = {} 
 +        cls._tool_box = QToolBox() 
 + 
 +        def render_page(suffix:str) ->QScrollArea: 
 +            scroll_area = QScrollArea() 
 +            scroll_area.setWidgetResizable(True) 
 +            widget_content = QWidget() 
 +            layout = QFormLayout(widget_content) 
 +            layout.setVerticalSpacing(15) 
 +            layout.setLabelAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) 
 +            row: int = 0 
 +            for key, prop in cls.__annotations__.items(): 
 +                if not key.endswith(suffix): continue 
 +                cls._lable_list[key] = QLabel() 
 +                cls._lable_list[key].setWordWrap(True) 
 +                layout.setWidget(row, QFormLayout.LabelRole, cls._lable_list[key]) 
 +                layout.setWidget(row, QFormLayout.FieldRole, prop.get_input_widget()) 
 +                row += 1 
 +            scroll_area.setWidget(widget_content) 
 +            return scroll_area 
 + 
 +        for i in range(1, 6): 
 +            cls._tool_box.addItem(render_page(f"s{i}"), ""
 + 
 +        return cls._tool_box 
 + 
 +    @classmethod 
 +    def retranslate(cls) -> None: 
 +        for key, label in cls._lable_list.items(): 
 +            label.setText(cls.get_property(key).get_name()) 
 +            cls.__annotations__[key].retranslate() 
 + 
 +        for i in range(cls._tool_box.count()): 
 +            cls._tool_box.setItemText(i, QCoreApplication.translate("properties", f"Section {i+1}")) 
 +</code>
  
 А вот так выглядит новый интерфейс, уже намного лучше. Это только один из вариант группировки свойств по разделам, также можно для таких целей использовать виджеты: [[:products:pussy:other:qtabwidget|QTabWidget]], [[:products:pussy:other:qstackedwidget|QStackedWidget]] совместно с виджетом для выбора элементов, например, [[:products:pussy:other:qlistwidget|QListWidget]], [[:products:pussy:other:qcombobox|QComboBox]] и другие.{{  :products:pussy:screenshots:lessons:def_propcontainer_gui_2.jpg?200  |def_propcontainer_gui_2.jpg}}Теперь, попробую объяснить код, который я написал, начну с метода// render_layout()//, в самом начале определяем словарь //_lable_list//, в котором будут содержаться все подписи для свойств, которые представляют из себя экземпляры виджета QLable, а в переменной //_tool_box // будет находиться экземпляр [[:products:pussy:other:qtoolbox|QToolBox]], обе эти переменные сохраняются в классе, чтобы был к ним доступ из других методов. Затем я ввел вспомогательную вложенную функцию //render_page()//, которая отбирает свойства, имена которых имеют указанный суффикс и упаковывает их в форму ([[:products:pussy:other:qformlayout|QFormLayout]]) внутри виджета, который в свою очередь вложен в область ([[:products:pussy:other:qscrollarea|QScrollArea]]), затем функция возвращает сформированный интерфейс; в цикле //for // производится обход всех Свойств, которые хранятся в словаре //_ _annotations_ _//, имена свойств, которые не имеют нужный суффикс игнорируются, а те что соответствуют, у них берется виджет для ввода методом //get_input_widget()//, затем он добавляется в форму layout([[:products:pussy:other:qformlayout|QFormLayout]]) в правый столбец (роль //[[:products:pussy:other:qformlayout|QFormLayout]].[[:products:pussy:other:fieldrole|FieldRole]]), // а подписи для свойств (экземпляры QLable) помещаются в левый столбец (роль //[[:products:pussy:other:qformlayout|QFormLayout]].[[:products:pussy:other:labelrole|LabelRole]]//). Заметьте, что для подписей Свойств текст не устанавливается, это будет сделано позднее. В конце производится добавление страниц в //_tool_box//, для этого вызыватся метод //addItem()//, которому передается результат функции //render_page(), // которой передаются строки с суффиксами, определенные нами ранее. А вот так выглядит новый интерфейс, уже намного лучше. Это только один из вариант группировки свойств по разделам, также можно для таких целей использовать виджеты: [[:products:pussy:other:qtabwidget|QTabWidget]], [[:products:pussy:other:qstackedwidget|QStackedWidget]] совместно с виджетом для выбора элементов, например, [[:products:pussy:other:qlistwidget|QListWidget]], [[:products:pussy:other:qcombobox|QComboBox]] и другие.{{  :products:pussy:screenshots:lessons:def_propcontainer_gui_2.jpg?200  |def_propcontainer_gui_2.jpg}}Теперь, попробую объяснить код, который я написал, начну с метода// render_layout()//, в самом начале определяем словарь //_lable_list//, в котором будут содержаться все подписи для свойств, которые представляют из себя экземпляры виджета QLable, а в переменной //_tool_box // будет находиться экземпляр [[:products:pussy:other:qtoolbox|QToolBox]], обе эти переменные сохраняются в классе, чтобы был к ним доступ из других методов. Затем я ввел вспомогательную вложенную функцию //render_page()//, которая отбирает свойства, имена которых имеют указанный суффикс и упаковывает их в форму ([[:products:pussy:other:qformlayout|QFormLayout]]) внутри виджета, который в свою очередь вложен в область ([[:products:pussy:other:qscrollarea|QScrollArea]]), затем функция возвращает сформированный интерфейс; в цикле //for // производится обход всех Свойств, которые хранятся в словаре //_ _annotations_ _//, имена свойств, которые не имеют нужный суффикс игнорируются, а те что соответствуют, у них берется виджет для ввода методом //get_input_widget()//, затем он добавляется в форму layout([[:products:pussy:other:qformlayout|QFormLayout]]) в правый столбец (роль //[[:products:pussy:other:qformlayout|QFormLayout]].[[:products:pussy:other:fieldrole|FieldRole]]), // а подписи для свойств (экземпляры QLable) помещаются в левый столбец (роль //[[:products:pussy:other:qformlayout|QFormLayout]].[[:products:pussy:other:labelrole|LabelRole]]//). Заметьте, что для подписей Свойств текст не устанавливается, это будет сделано позднее. В конце производится добавление страниц в //_tool_box//, для этого вызыватся метод //addItem()//, которому передается результат функции //render_page(), // которой передаются строки с суффиксами, определенные нами ранее.
products/pussy/other/dev_propertycontainer_gui.1702342535.txt.gz · Последнее изменение: (внешнее изменение)