Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornyy_praktikum_po_programmirovaniyu_v_s...docx
Скачиваний:
0
Добавлен:
11.12.2019
Размер:
130.48 Кб
Скачать
  1. Лабораторная работа № 7

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

    1. Пример 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()); 
// повторяем рисование, пока не закончится список
}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]