Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Рисуем с помощью обработки событий мыши и paintEvent
Сегодня будет интересный пример. Такой примитивный графический редактор. Впрочем, если над программой поработать, то можно сделать и векторный редактор, вполне себе функциональный.
Сегодня снова материал, который был представлен в статье:
Если вы ещё не читали эту статью, прочтите
И так, какова функциональность представленной ниже программы:
- Всё рисование осуществляется только с помощью мыши.
- Рисовать можно при нажатой левой кнопки мыши. Возможности рисовать пропадают при отпускании кнопки.
- Правая кнопка мыши позволяет делать откат действий, начиная с последнего.
Вот, собственно, и все возможности этой простой программы. Но программа интересна своим алгоритмом, увязывающим разные события.
Программа получилась, кстати, компактной (см. ниже). На рисунке 1 мои каракули мышью в окне программы.
Пояснения к программе. Впрочем, там есть подробные комментарии, я бы вам советовал попытаться разобраться именно по комментариям.
- Центральным в программе является массив vcp. Он состоит из троек чисел. Первые два числа координаты курсора мыши. Третье число - флаг. Если он равен 1, то от этой точки не рисуем. Смысл очень простой: мы отпускаем кнопку и линия как бы фиксируется. Следующая линия начнётся при следующем нажатии левой кнопкой мыши и движением курсора по поверхности окна. Кстати при откате (правая кнопка мыши) флагу последней точке также присваивается значение 1.
- Флаг f указывает, что рисование разрешено (0) или запрещено (1).
- Наступление события paintEvent() приводит к перерисовке всех линий. Заметим лишний раз, что перерисовка происходит и при изменении размеров окна и при выполнении QWidget.update().
- Незабываем, что QWidget.setMouseTracking(True) разрешает отслеживать положение курсора мыши (mouseMoveEvent).
- Обращаю внимание, что в событии mouseReleaseEvent() обрабатываются отпускания и левой и правой кнопок мыши.
- При отслеживании движения курсора мыши (mouseMoveEvent()) мы фиксируем любую новую координату курсора (если левая кнопка мыши нажата). Т.е. весь рисунок у нас хранится в памяти. Поэтому мы и можем делать откат последней операции. С тем же успехом мы могли сохранить рисунок в файл, а потом при желании восстановить его.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.