Тема: «Рисование мышью»
Пример 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());
// повторяем рисование, пока не закончится список
}