Russian Qt Forum
Июнь 15, 2024, 22:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Repaint без перерисовки содержимого экрана  (Прочитано 5730 раз)
Алёна_4_12_1989
Гость
« : Июль 10, 2013, 16:16 »

Здравствуйте. Мне необходимо делать repaint для моего виджета. При этом хотелось бы, чтобы регион, заданный в repaint не стирался, так как предполагается просто дорисовка части графики поверх нужного региона этого виджета. Но repaint каждый раз стирает этот регион перед тем как вызвать paintEvent. Я работаю c Qt 4. Можете подсказать, как это сделать? Спасибо.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 10, 2013, 17:49 »

Предположение: перед дорисовкой области, сохраните регион, например, на QImage. Дорисуете на том QImage, что вам нужно, и в событии paintEvent виджета уже рисуйте то, что теперь на QImage находится Улыбающийся
Записан

Алёна_4_12_1989
Гость
« Ответ #2 : Июль 10, 2013, 18:18 »

Спасибо, но как-то это медленно будет. Может быть, там можно какое-нибудь состояние для виджета установить?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 10, 2013, 18:44 »

Спасибо, но как-то это медленно будет.
Нормально будет

Может быть, там можно какое-нибудь состояние для виджета установить?
Нет, потому что неизвестно что на текущем экране (напр ошметки окон др приложения)
Записан
Алёна_4_12_1989
Гость
« Ответ #4 : Июль 11, 2013, 14:57 »

Спасибо за ответы.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #5 : Июль 11, 2013, 17:33 »

Вопрос в тему: а что делает void QWidget::repaint(const QRect & rect), если paintEvent все равно весь виджет перерисовывает, а не какой-то конкретно заданный регион?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Bepec
Гость
« Ответ #6 : Июль 11, 2013, 18:15 »

Разве?

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

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

Записан
popper
Гость
« Ответ #7 : Июль 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);
 
Записан
Bepec
Гость
« Ответ #8 : Июль 12, 2013, 13:04 »

Точно так как я и сказал Веселый
Записан
Алёна_4_12_1989
Гость
« Ответ #9 : Июль 15, 2013, 16:09 »

А кто-нибудь может объяснить мне, как в Qt вообще происходит отрисовка нескольких виджетов. К примеру, когда на одном виджете несколько виджетов, которые пересекаются к тому же. Т.е. главное здесь, что одни и те же виджеты имеют общую область на экране. Какие (чьи) paintEventы вызываются? И можно ли сделать так, чтобы при апдэйте верхнего виджета не перерисовывались нижние виджеты? Так как если я правильно всё сделала, получается что при нахождении нескольких виджетов друг на друге вызываются пэйнт ивенты всех этих виджетов. Хотелось бы этого избежать. Вообщем, если кто-то разбирается в отрисовке qt, просвятите пожалуйста. Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 15, 2013, 16:59 »

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

Не пойму откуда такой необычный интерес к рисованию, наверное преподы мудрят и чего-то от Вас хотят  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.197 секунд. Запросов: 21.