Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 25, 2025 09:37:24

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 68
Репутация: +  1  -
Профиль   Отправить e-mail  

Виджеты

Доброго времени всем. Такой вопрос. Есть например окно с двумя виджетами. Слева виджет с кнопками типа меню, а справа все меняется при переключении этих кнопок меню. Вопрос такой тыкнули на меню и справа там появилась таблица смотрим данные какие то. Потом после переключения на другое меню и возвращаемся обратно то есть тыкнули и там уже таблица пустая без данных. То есть проблема понятно у меня на каждую кнопку создаются новые виджеты справа и поэтому данные обнуляются,а хотелось бы в некоторых виджетах сохранить данные, то есть не создавать виджет. Нужен минимальный пример,например 2 кнопки типа меню и виджет к каждой кнопке прикрутить. Задача когда тыкнули на одну кнопку появился виджет с данными,ввели какие то данные например в поле ввода. Потом захотели перейти на другой виджет по другой кнопке и при возврате на первую кнопку чтобы данные не стерлись из поля ввода.

Офлайн

#2 Июнь 25, 2025 10:19:43

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 68
Репутация: +  1  -
Профиль   Отправить e-mail  

Виджеты

Более конкретный пример. Допустим слева кнопка 1 и кнопка 2. Справа центральный виджет где все будет меняться, то есть как бы главная область. Нажали на первую кнопка и справа создается виджет и в нем таблица и прочие виджеты. Загружаю извне например данные в таблицу,поделал что-то. Потом нажали на вторую кнопку и справа создается виджет с формой или что то другое не важно. Затем снова нажал на первую кнопку и хотелось бы чтобы отобразилось то что уже есть то есть таблица с данными,а у меня там создается снова виджет,таблица и приходится снова загружать данные. То есть по логике хотелось бы у первой кнопки создать виджеты справа один раз и при переходе по другим кнопкам этот виджет скрывать или открывать. То есть нужен пример как правильно написать. Pyqt5

Офлайн

#3 Июнь 25, 2025 14:46:45

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 68
Репутация: +  1  -
Профиль   Отправить e-mail  

Виджеты

Все вопрос решен. Получилось сделать с помощью hide и show. Буду переписывать код и если будут вопросы то отпишусь.

Офлайн

#4 Июнь 25, 2025 17:51:20

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Виджеты

> То есть нужен пример как правильно написать. Pyqt5

Смотри в сторону QStackedWidget



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Июнь 26, 2025 02:02:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Виджеты

Ser5+
Есть например окно с двумя виджетами. Слева виджет с кнопками типа меню, а справа все меняется при переключении этих кнопок меню. Вопрос такой тыкнули на меню и справа там появилась таблица смотрим данные какие то. Потом после переключения на другое меню и возвращаемся обратно то есть тыкнули и там уже таблица пустая без данных. То есть проблема понятно у меня на каждую кнопку создаются новые виджеты справа и поэтому данные обнуляются,а хотелось бы в некоторых виджетах сохранить данные, то есть не создавать виджет.
Архитектурно нужно разделить одну сущность “виджет” на две сущности “виджет” и “объект с данными для виджета”. При переключении можно очищать содержимое объекта с данными или оставлять содержимое объекта с данными. И при создании виджета объект с данными агрегируется в виджете (это значит, что время жизни виджета и время жизни объекта не совпадают). Так, если виджет уничтожается, то объект с данными продолжает существовать. Если виджет создаётся снова, то к нему привязывается тот же самый объект с данными. Таким образом при некоторых переключениях ты можешь очищать объект с данными, а при некоторых переключениях ты можешь оставлять объект с данными заполненным какими-то данными.

Ser5+
а у меня там создается снова виджет,таблица
Потому что между ними сделано отношение композиции, а не агрегации. При композиции у них время жизни совпадает.

Пример агрегации
  
>>> class Widget:
...     def __init__(self, table):
...         self.table = table
... 
>>> class Table:
...     def __init__(self):
...         self.data = 'abc'
... 
>>> table = Table()
>>> 
>>> widget = Widget(table)
>>> print(widget.table.data)
abc
>>> 
>>> del widget
>>> 
>>> print(table.data)
abc
>>>
Объект таблицы существует до создания объекта виджет, во время существования объекта виджет и после разрушения объекта виджет.

Пример композиции
  
>>> class Widget:
...     def __init__(self):
...         self.table = Table()
... 
>>> class Table:
...     def __init__(self):
...         self.data = 'abc'
... 
>>> widget = Widget()
>>> print(widget.table.data)
abc
>>> 
>>> del widget
>>> 
>>> print(widget.table.data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'widget' is not defined. Did you mean: 'Widget'?
>>>
Объект таблицы не существует до создания объекта виджет, существует во время существования объекта виджет и не существует после разрушения объекта виджет.

Ser5+
То есть нужен пример как правильно написать.
Да он громоздкий. Если правильно писать, это надо сделать отдельную форму.



Отредактировано py.user.next (Июнь 26, 2025 02:06:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version