Здравствуйте!
Теперь не удаётся стереть содержимое окна, если надо вывести другой вид. Qt 4.6.3.
Т.е. в зависимости от выбранного в меню режима работы надо выводить соответствующий вид,
со своими текстами и управляющими элементами. Это получается только в 1-й раз, а потом
очередной вид рисуется поверх 1-го, хотя я вызываю eraseRect и fillRect. И ещё во 2-й раз не выводятся
строки функцией drawText, выводятся только в 1-й раз. Это независимо от того, рисовать сразу в this
или через QPixmap.
Как это правильно делать, т.е. стереть старый вид? Установить какой-нибудь атрибут виджета или окна,
какой-то функцией или как? Просьба посоветовать.
Пётр.
Erasing in Qt
Бррррр. Пошёл за несколькими литрами водки.....
Это о чем вопрос?
Где то не стыковка.....
Что у вас является содержимым окна: это элементы формы или это картинка (ни или вы элементы формы полностью сами рисуете на картинке)?
Это виджеты, например, QComboBox и другие. Я уже нашёл, как добиться чистой
перерисовки экрана с другими элементами. Для этого, прежде чем paintEvent(),
будет его заполнять новым содержимым, надо вызвать this->update(), а перед этим
отключить от this те виджеты, которые не надо перерисовывать, вызовом для
каждого setParent(0). Если же отключать их в paintEvent(), то от них остаются следы.
Т.е. теперь я сначала вызываю для них setParent(0), потом вызываю this->update()
и после этого изменяю один параметр, в зависимости от которого в painEvent()
рисуется то или иное. Разумеется, для этого уже в paintEvent() для таких виджетов
вызывается setParent(this).
Пётр.
Ужас. Както все сложно. Хотите - выделите минимально работающий пример из вашего проекта и передайте мне - я гляну. Но как то со слов все очень непонятно и через тернии.
1. У наследников QWidget есть метод setVisible(bool) - если вам они еще могут пришодиться
2. Если хотите освободить память deleteLater() или delete <Имя_Объекта> .....
3. А есть классы для создания например фреймов QFrame
Я не считаю, что это сложно - подключить к this или отключить.
При подключении - да, в paintEvent() я вызываю show().
Т.е. в моём случе в слоте, подключённом к пукту меню, для ненужных виджетов
вызываются setParent(0), затем this->update(), потом для нужных виджетов
setParent(this), потом устaнавливается параметр для paintEvent(), в зависимости
от которого там рисуется то или иное и флаг для paintЕvent(), при котором она
делает перерисовку, а затем сбрасывает его.
Пётр.
Ну я сказал "сложно" сокрее не в том плане, что это слоность. Скорее это как-то неправильно: есть стандартные методы, а вы пользуетесь обходными путями.
Раз вам нужны все эти виджеты все время работы программы, я б сделал фреймы. Достатчно скрыть/показать один объект, и вместе с ним будут скрываться/отображаться все содержащиеся на нем виджеты, что удобно в последующем, когда захотите добавить что либо.
В прочем все это имхо.
Наверное, вы правы и с фреймами было бы проще, но я ими никода не пользовался.
Сначала я пытался рисовать в QPixmap и уже его выводить на this, но там это явление
и обнаружилось. Идеологически я не знаю, что правильнее. Фреймы - это дополнительная
сущность, но вообще я первоначально тоже предполагал иметь несколько объектов
QPixmap и выводить то, который нужен, но и с одним не получилось.
Пётр.