1

Здравствуйте!

Теперь не удаётся стереть содержимое окна, если надо вывести другой вид. Qt 4.6.3.
Т.е. в зависимости от выбранного в меню режима работы надо выводить соответствующий вид,
со своими текстами и управляющими элементами. Это получается только в 1-й раз, а потом
очередной вид рисуется поверх 1-го, хотя я вызываю eraseRect и fillRect. И ещё во 2-й раз не выводятся
строки функцией drawText, выводятся только в 1-й раз. Это независимо от того, рисовать сразу в this
или через QPixmap.

Как это правильно делать, т.е. стереть старый вид? Установить какой-нибудь атрибут виджета или окна,
какой-то функцией или как? Просьба посоветовать.

Пётр.

Пётр.

2

Бррррр. Пошёл за несколькими литрами водки.....

Это о чем вопрос?

Где то не стыковка.....

Что у вас является содержимым окна: это элементы формы или это картинка (ни или вы элементы формы полностью сами рисуете на картинке)?

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

3

Это виджеты, например, QComboBox и другие. Я уже нашёл, как добиться чистой
перерисовки экрана с другими элементами. Для этого, прежде чем paintEvent(),
будет его заполнять новым содержимым, надо вызвать this->update(), а перед этим
отключить от this те виджеты, которые не надо перерисовывать, вызовом для
каждого setParent(0). Если же отключать их в paintEvent(), то от них остаются следы.
Т.е. теперь я сначала вызываю для них setParent(0), потом вызываю this->update()
и после этого изменяю один параметр, в зависимости от которого в painEvent()
рисуется то или иное. Разумеется, для этого уже в paintEvent() для таких виджетов
вызывается setParent(this).

Пётр.

Пётр.

4

Ужас. Както все сложно. Хотите - выделите минимально работающий пример из вашего проекта и передайте мне - я гляну. Но как то со слов все очень непонятно и через тернии.

1. У наследников QWidget есть метод setVisible(bool) - если вам они еще могут пришодиться
2. Если хотите освободить память deleteLater() или delete <Имя_Объекта> .....
3. А есть классы для создания например фреймов QFrame

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

5 (13.09.2011 21:12:17 отредактировано Peter)

Я не считаю, что это сложно - подключить к this или отключить.
При подключении - да, в paintEvent() я вызываю show().
Т.е. в моём случе в слоте, подключённом к пукту меню, для ненужных виджетов
вызываются setParent(0), затем this->update(), потом для нужных виджетов
setParent(this), потом устaнавливается параметр для paintEvent(), в зависимости
от которого там рисуется то или иное и флаг для paintЕvent(), при котором она
делает перерисовку, а затем сбрасывает его.

Пётр.

Пётр.

6

Ну я сказал "сложно" сокрее не в том плане, что это слоность. Скорее это как-то неправильно: есть стандартные методы, а вы пользуетесь обходными путями.
Раз вам нужны все эти виджеты все время работы программы, я б сделал фреймы. Достатчно скрыть/показать один объект, и вместе с ним будут скрываться/отображаться все содержащиеся  на нем виджеты, что удобно в последующем, когда захотите добавить что либо.


В прочем все это имхо.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

7

Наверное, вы правы и с фреймами было бы проще, но я ими никода не пользовался.
Сначала я пытался рисовать в QPixmap и уже его выводить на this, но там это явление
и обнаружилось. Идеологически я не знаю, что правильнее. Фреймы - это дополнительная
сущность, но вообще я первоначально тоже предполагал иметь несколько объектов
QPixmap и выводить то, который нужен, но и с одним не получилось.

Пётр.

Пётр.