Я делаю приложение для научной визуализации на PyQt5. PyQt (и Qt) я толком не знаю, осваиваю на ходу.
Окошко приложения выглядит так - слева элементы управления, остальную часть окна занимает собственно картинка, вокруг нее всякое зарамочное оформление (чиселки, метки к осям и пр). Картинка занимает большую часть окна. Картинка генерится как растр в недрах C++, это относительно дорогая операция. Поверх всего этого надо динамически (вместе с движением мыши) отображать некоторую информацию - выводить координаты точки куда указывает курсор, какие то линии рисовать привязанные к курсору, что то подсвечивать и пр.
Таким образом есть три варианта перерисовки:
-
самая простая - меняем только то что связано с мышью при ее движении (скажем выводится крест на всю картинку что бы было видно куда по осям графика попадает курсор).
-
самая сложная - при нажатии на элемент управления перерисовываем все, включая картинку.
-
промежуточная по сложности, при изменении размера окна - пока размер меняется зарамочное оформление перерисовываем, картинку масштабируем. Когда изменение размера окна закончено, вызываем перерисовку 2.
Пока что в голову пришло вот такое - картинка возвращается из C++ как буфер. Зарамочное оформление (и картинка) рисуются через QPainter на QPixmap, это перерисовка 2. В перерисовке 1 выводится каждый раз этот QPixmap и поверх него набрасывается то что связано с мышью.
Можно ли это как то сделать более Ъ? Мне скажем не нравится то, что приходится много раз делать копии самой большой части изображения. Я бы из C++ рисовал скажем сразу в память QPixmap, да фиг к ней похоже достучишься…
Еще я пока не понял как ловить окончание изменений размера окна (когда юзер мышку отпустил). mouseReleaseEvent в этом случае не вызывается похоже.