Название: 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)
определяется нужно ли перерисовывать весь виджет или отдельный регион: Код
Название: 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Не пойму откуда такой необычный интерес к рисованию, наверное преподы мудрят и чего-то от Вас хотят :) |