Лабораторная работа № 7

Тема: «Рисование мышью»

Пример 1: программа, которая рисует траектории движения мыши при нажатой левой кнопке выбранным цветом и стирает рисунок при щелчке правой кнопкой мыши.

Создайте проект на основе главного окна и задайте белый цвет фона в свойс­твах этого окна.

В файле mainwindow.h объявите функции:

void mousePressEvent(QMouseEvent *e);

// функция, вызываемая при нажатии кнопки мыши

void mouseMoveEvent(QMouseEvent *e);

 // функция, вызываемая при движении мыши

void paintEvent(QPaintEvent *);

 // функция, автоматически вызываемая при перерисовке окна

Тамже объявите переменные и объекты:

QColor color; // цвет линий

QPoint p[2];

// точки, определяющие линию (фрагмент траектории движения мыши)

bool drawMode; // признак рисования

QList<QLine> DrawBuffer; // список для хранения линий

QList<QColor> ColorBuffer; // список для хранения цветов линий

public slots:

void showDialog(); // слот, вызываемый при нажатии кнопки в меню

 

Отредактируйте файл mainwindow.cpp как показано ниже:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QtGui>

MainWindow::MainWindow(QWidget *parent):

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

 // обеспечиваем использование кириллицы:   

QTextCodec* codec = QTextCodec::codecForName("UTF-8");

QTextCodec::setCodecForCStrings(codec);

 // добавляем в меню кнопку без выпадающего списка 

QAction* act = ui->menuBar->addAction("Выбор цвета");

 // устанавливаем акселератор:

act->setShortcut(QString("Alt+C"));

 // при нажатии на кнопку в меню должно появиться окно для выбора цвета:

connect(act, SIGNAL(triggered()), this, SLOT(showDialog()));

// задаем начальные значения:  

p[0] = p[1] = QPoint(0,0);

color = QColor(0,100,100);

drawMode = false;

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::showDialog()

{

color = QColorDialog::getColor(); // считываем цвет

}

void MainWindow::mousePressEvent(QMouseEvent *e)

{

if (e->button() == Qt::LeftButton) // если нажата левая кнопка мыши

{

   drawMode = true; // устанавливаем признак рисования

   p[0] = e->pos(); // запоминаем координаты начальной точки

}

if (e->button() == Qt::RightButton) // если нажата правая кнопка

{

   color = QColor(0,100,100); // восстанавливаем первоначальный цвет

   DrawBuffer.clear(); // очищаем списки

   ColorBuffer.clear();

drawMode = false; // правой кнопкой запретим рисовать

   update(); // перерисовываем окно

}

}

void MainWindow::mouseMoveEvent(QMouseEvent *e)

{

if (drawMode) // если установлен режим рисования

{

   p[1] = e->pos(); // запоминаем текущую точку

   DrawBuffer.append(QLine(p[0],p[1])); // добавляем линию в список

   ColorBuffer.append(color); // добавляем текущий цвет в список

   p[0] = p[1];

// текущую точку делаем начальной для следующего фрагмента линии

   update();

}

}

void MainWindow::paintEvent(QPaintEvent *)

{

if (DrawBuffer.size() < 1) return;

// если рисовать нечего, выходим из функции

QPainter painter(this);

 // объявляем итераторы для работы со списками:  

QList<QLine>::const_iterator it = DrawBuffer.begin();

QList<QColor>::const_iterator cit = ColorBuffer.begin();

 // перерисовываем линии:

do

{

   painter.setPen(*cit++);

// определяем перо того цвета, которое хранится в списке

   painter.drawLine(*it++); // рисуем фрагмент линии

} while (it!= DrawBuffer.end());

// повторяем рисование, пока не закончится список

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: