В Qt4 как проверить, запускается ли paintEvent при изменении размера? - PullRequest
4 голосов
/ 05 октября 2009

В приложении Qt4 возможно ли определить внутри обработчика paintEvent(), была ли перерисовка вызвана изменением размера или нет?

У меня есть виджет, который очень медленно перерисовывается (сложный график), и я хочу ускорить изменение размера, просто перетаскивая растровое изображение с измененным размером , в то время как размер виджета изменяется, и только перерисовывается виджет когда изменение размера завершено.

Я пытался установить / снять флаг в начале и в конце resizeEvent(), но это, похоже, не работает (т.е. флаг всегда отключен в paintEvent()).

Ответы [ 3 ]

6 голосов
/ 05 октября 2009

Я не думаю, что вы можете легко это сделать. Трудно сказать, когда изменение размера началось / остановилось, особенно кроссплатформенным способом. Вероятно, у меня был бы таймер одиночного снимка, сработавший на resizeEvent, который бы отображал изображение на QPixmap. Если вы получите еще один resizeEvent, пока таймер еще активен, просто перезапустите его. В paintEvent всегда рисуйте текущее растровое изображение, и после рендеринга нового растрового изображения из таймера вызовите update() в виджете. Не идеальное решение, но оно должно работать.

3 голосов
/ 05 октября 2009

Один из подходов, который вы можете использовать, - это всегда рисовать растровое изображение, но не забывайте заново создавать растровое изображение, если размер окна изменился.

Итак, когда приходит paintEvent, если размер отличается от текущего размера растрового изображения, то в любом случае закрашиваем сохраненное растровое изображение, но затем устанавливаем (или сбрасываем) QTimer , чтобы вызвать сигнал в слоте который обновит изображение.

Когда этот метод обновления запускается, он повторно отображает растровое изображение и запрашивает обновление виджета.

1 голос
/ 16 октября 2009

Другой возможностью было бы взглянуть на то, как QMdiSubWindow :: RubberBandResize реализован внутри, это может дать подсказки о том, как этого добиться. Работает только в QMdiSubwindow, если я правильно помню - он «останавливает» рисование (за исключением небольшой границы окна с прозрачным телом) во время изменения размера и запускает один финальный resizeEvent (который вызывает обновление / рисование), когда вы прекращаете изменять размер окна ...

...