Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Алёна_4_12_1989 от Июля 10, 2013, 16:16



Название: Repaint без перерисовки содержимого экрана
Отправлено: Алёна_4_12_1989 от Июля 10, 2013, 16:16
Здравствуйте. Мне необходимо делать repaint для моего виджета. При этом хотелось бы, чтобы регион, заданный в repaint не стирался, так как предполагается просто дорисовка части графики поверх нужного региона этого виджета. Но repaint каждый раз стирает этот регион перед тем как вызвать paintEvent. Я работаю c Qt 4. Можете подсказать, как это сделать? Спасибо.


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: gil9red от Июля 10, 2013, 17:49
Предположение: перед дорисовкой области, сохраните регион, например, на QImage. Дорисуете на том QImage, что вам нужно, и в событии paintEvent виджета уже рисуйте то, что теперь на QImage находится :)


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Алёна_4_12_1989 от Июля 10, 2013, 18:18
Спасибо, но как-то это медленно будет. Может быть, там можно какое-нибудь состояние для виджета установить?


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Igors от Июля 10, 2013, 18:44
Спасибо, но как-то это медленно будет.
Нормально будет

Может быть, там можно какое-нибудь состояние для виджета установить?
Нет, потому что неизвестно что на текущем экране (напр ошметки окон др приложения)


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Алёна_4_12_1989 от Июля 11, 2013, 14:57
Спасибо за ответы.


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Kurles от Июля 11, 2013, 17:33
Вопрос в тему: а что делает void QWidget::repaint(const QRect & rect), если paintEvent все равно весь виджет перерисовывает, а не какой-то конкретно заданный регион?


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Bepec от Июля 11, 2013, 18:15
Разве?

Насколько я помню, в paintEvent передаётся регион, который нуждается в перерисовке.

То, что многие делают полную перерисовку, не желая описывать алгоритм перерисовки отдельных частей, это уже допущение. Да, так можно и так многие делают, в том числе и я. Но правильнее по идеологии рисовать на буфере, а в paintEvent отрисовывать необходимые регионы.



Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: popper от Июля 12, 2013, 12:55
Вот как в void QWidgetPrivate::repaint_sys(const QRegion &rgn)
определяется нужно ли перерисовывать весь виджет или отдельный регион:

Код
C++ (Qt)
// QGLWidget does not support partial updates if:
// 1) The context is double buffered
// 2) The context is single buffered and auto-fill background is enabled.
const bool noPartialUpdateSupport = (engine && (engine->type() == QPaintEngine::OpenGL
                                                  || engine->type() == QPaintEngine::OpenGL2))
                                                  && (usesDoubleBufferedGLContext || q->autoFillBackground());
QRegion toBePainted(noPartialUpdateSupport ? q->rect() : rgn);
 


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Bepec от Июля 12, 2013, 13:04
Точно так как я и сказал :D


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Алёна_4_12_1989 от Июля 15, 2013, 16:09
А кто-нибудь может объяснить мне, как в Qt вообще происходит отрисовка нескольких виджетов. К примеру, когда на одном виджете несколько виджетов, которые пересекаются к тому же. Т.е. главное здесь, что одни и те же виджеты имеют общую область на экране. Какие (чьи) paintEventы вызываются? И можно ли сделать так, чтобы при апдэйте верхнего виджета не перерисовывались нижние виджеты? Так как если я правильно всё сделала, получается что при нахождении нескольких виджетов друг на друге вызываются пэйнт ивенты всех этих виджетов. Хотелось бы этого избежать. Вообщем, если кто-то разбирается в отрисовке qt, просвятите пожалуйста. Спасибо.


Название: Re: Repaint без перерисовки содержимого экрана
Отправлено: Igors от Июля 15, 2013, 16:59
Вообщем, если кто-то разбирается в отрисовке qt, просвятите
Наверное "просветите". Да, виджеты очень часто друг на друге, хотя бы потому что одни являются родителями других. Но никаких проблем это не вызывает. Простой пример: окно, в нем кнопка. Когда рисуется окно, область кнопки автоматычно исключается из региона рисования, окно не может рисовать поверх кнопки даже если захочет. А если виджет полностью перекрыт, то для него и paintEvent не вызывается. Точно так же и без Qt в любом современном ОC

Не пойму откуда такой необычный интерес к рисованию, наверное преподы мудрят и чего-то от Вас хотят  :)