Найти тему

Программирование на языке Python. Графика PyQt5. Пример алгоритма рисования с помощью мыши

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Рисуем с помощью обработки событий мыши и paintEvent

Сегодня будет интересный пример. Такой примитивный графический редактор. Впрочем, если над программой поработать, то можно сделать и векторный редактор, вполне себе функциональный.

Сегодня снова материал, который был представлен в статье:

Если вы ещё не читали эту статью, прочтите

И так, какова функциональность представленной ниже программы:

  • Всё рисование осуществляется только с помощью мыши.
  • Рисовать можно при нажатой левой кнопки мыши. Возможности рисовать пропадают при отпускании кнопки.
  • Правая кнопка мыши позволяет делать откат действий, начиная с последнего.

Вот, собственно, и все возможности этой простой программы. Но программа интересна своим алгоритмом, увязывающим разные события.

Программа получилась, кстати, компактной (см. ниже). На рисунке 1 мои каракули мышью в окне программы.

Скриншот программы "Рисование". Полный текст программы см. по ссылке ниже
Скриншот программы "Рисование". Полный текст программы см. по ссылке ниже
primer238.py

Пояснения к программе. Впрочем, там есть подробные комментарии, я бы вам советовал попытаться разобраться именно по комментариям.

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

Ну, пока всё!

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

Вы рисуете как курица лапой
Вы рисуете как курица лапой