Qt之鼠标随手画及画多边形

首先介绍下项目结构,其中

class Figure
class FreeHand
class Polygon
的父类。

class ViewWidget
是画图区,继承自

QWidget

Qt之鼠标随手画及画多边形_第1张图片下面介绍具体代码:

main.cpp

#include "Widgets/mainwindow.h"
#include 

int main(int argc, char *argv[])
{
   _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);//内存检漏
   QApplication a(argc, argv);
   MainWindow main;
   main.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "Widgets/viewwidget.h"
#include
#include
#include

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void Init();
    void CreateButtons();


    ~MainWindow();

private:
    QAction *hello_world_action_;
    QToolBar *main_toolbar_;
    QMenu *main_menu_;
    ViewWidget* view_widget_;   //声明ViewWidget指针

    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "Widgets/mainwindow.h"
#include "ui_mainwindow.h"
#include "Widgets/viewwidget.h"
#include
#include
#include

using namespace std;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Init();

}


void  MainWindow::Init()
{
    view_widget_ = new ViewWidget();
    setCentralWidget(view_widget_);
    CreateButtons();
}

void MainWindow::CreateButtons()
{

    

    hello_world_action_ = new QAction(QIcon(":/Mainwindow/picture/Polygon"), tr("&Polygon"), this);  //增加Polygon工具栏
    connect(hello_world_action_, &QAction::triggered, view_widget_, &ViewWidget::set_figure_type_to_Polygon); //响应画多边形
    main_menu_->addAction(hello_world_action_);
    main_toolbar_->addSeparator();
    main_toolbar_->addAction(hello_world_action_);




    hello_world_action_ = new QAction(QIcon(":/Mainwindow/picture/FreeHand"), tr("&FreeHand"), this);  //增加FreeHand工具栏
    connect(hello_world_action_, &QAction::triggered, view_widget_, &ViewWidget::set_figure_type_to_FreeHand); //响应画自由曲线
    main_menu_->addAction(hello_world_action_);
    main_toolbar_->addSeparator();
    main_toolbar_->addAction(hello_world_action_);


    hello_world_action_ = new QAction(QIcon(":/Mainwindow/picture/Delete"), tr("&Delete"), this);  //增加Delete工具栏
    connect(hello_world_action_, &QAction::triggered, view_widget_, &ViewWidget::delete_last_action);
    main_menu_->addAction(hello_world_action_);
    main_toolbar_->addSeparator();
    main_toolbar_->addAction(hello_world_action_);



    hello_world_action_ = new QAction(tr("&About MiniDraw"), this);
    connect(hello_world_action_, &QAction::triggered, view_widget_, &ViewWidget::set_figure_type_to_Rectangle);
}

MainWindow::~MainWindow()
{
    delete ui;
}

viewwidget.h

#ifndef VIEWWIDGET_H
#define VIEWWIDGET_H
#include 
#include 
#include 
#include 

#include "Resource/figure.h"
#include "Resource/polygon.h"
#include "Resource/freehand.h"


using namespace std;
enum FigureType;

class ViewWidget : public QWidget
{
    Q_OBJECT
public:
    enum FigureType
    {
        kDefault = 0, kLine = 1, kRectangle = 2, kEllipse = 3, kPolygon = 4, kFreeHand = 5,
    };

    FigureType figure_type_;
    vector<Figure*> figure_array_;
    vector<Line*>  line_array_;



    explicit ViewWidget(QWidget *parent = 0);
    
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

    void paintEvent(QPaintEvent*);


    void set_figure_type_to_Polygon();
    void set_figure_type_to_FreeHand();
    void delete_last_action();

    ~ViewWidget();

signals:

public slots:

private:
  bool  draw_status_;  //绘制状态,true为绘制当前鼠标拖动的图元,false为不绘制
  QPoint start_point_;  //当前图元的起始点
  QPoint end_point_;    //当前图元的终点
  QPoint current_point_;
  vector<QPoint> points;
  QPainterPath  *path;

};

#endif // VIEWWIDGET_H

viewwidget.cpp

#include "Widgets/viewwidget.h"
#include 
#include 
#include 
#include "Widgets/mainwindow.h"
#include 
#include 


ViewWidget::ViewWidget(QWidget *parent) : QWidget(parent)
{
    draw_status_ = false;  //初始状态为不绘制
    this->path = NULL;
}

void ViewWidget::mousePressEvent(QMouseEvent* event)  //鼠标击发响应函数主体
{
    if(Qt::LeftButton == event->button()) //判断鼠标是否左击
    {
        draw_status_ = true;   //设置绘制状态为——绘制
        start_point_ = end_point_ = event->pos();  //将图元初始点设置为当前鼠标击发点
        if(figure_type_ == kPolygon)
        {
            points.push_back(start_point_);
        }

        if(figure_type_ == kFreeHand)
        {

            path = new QPainterPath;

            path->moveTo(event->pos());

        }


    }
}

void ViewWidget::mouseMoveEvent(QMouseEvent *event)  //鼠标移动响应函数主体
{
    if(draw_status_)  //判断当前绘制状态
    {
        end_point_ = event->pos();  //若为真,则设置图元终止点为当前鼠标位置
    }

    if(figure_type_ == kFreeHand)
    {
        path->lineTo(event->pos());
    }
}

void ViewWidget::mouseReleaseEvent(QMouseEvent *event) //鼠标释放响应函数主体
{

    Figure* current_figure_ = NULL;

    switch(figure_type_)
    {
    case kDefault:
        break;

    

    case kPolygon:
        points.push_back(end_point_);
        if(Qt::RightButton == event->button())
        {
            current_figure_ = new Polygon(points);
            figure_array_.push_back(current_figure_);
            points.clear();
        }
        break;

    case kFreeHand:
        current_figure_ = new FreeHand(*path);
        figure_array_.push_back(current_figure_);

        draw_status_ = false;

        delete path;

        path = NULL;
        break;

    default:
        break;
    }


    current_figure_ = NULL;

}

void ViewWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this); //定义painter
    for(size_t i = 0; i < figure_array_.size(); i++)
    {
        if(figure_array_[i] != NULL)
            figure_array_[i]->Draw(painter);
    }


    if(draw_status_)
    {
        switch(figure_type_)
        {
        case kDefault:
            break;

        

        case kFreeHand:
           std::cout<<"4"<<std::endl;

            if(path != NULL)
                painter.drawPath(*path);
            break;

        case kPolygon:
            if(points.size()==0)
            {
                break;
            }
            QPoint pre = points[0];
            for(int i=1;i < points.size();i++)
            {
                painter.drawLine(pre,points[i]);
                pre = points[i];
            }
            break;

        }
    }

    update();

}



void ViewWidget::set_figure_type_to_Polygon()
{
    figure_type_ = kPolygon;
}

void ViewWidget::set_figure_type_to_FreeHand()
{
    figure_type_ = kFreeHand;

}


void ViewWidget::delete_last_action()
{
    if(!figure_array_.empty())
    {
        delete figure_array_.back();
        figure_array_.pop_back();
    }

}



ViewWidget::~ViewWidget()
{
    for(size_t i = 0; i < figure_array_.size(); i++)
    {
        if(figure_array_[i])
        {
            delete figure_array_[i];
        }
    }
    figure_array_.clear();
}



figure.h

#ifndef FIGURE_H
#define FIGURE_H
#include 

class Figure
{
public:
     Figure();

    virtual void Draw(QPainter &);
    virtual ~Figure();
};

#endif // FIGURE_H

figure.cpp

#include "Resource/figure.h"
#include

Figure::Figure()
{

}

Figure::~Figure()
{

}
void Figure::Draw(QPainter &)
{

}

freehand.h

#ifndef FREEHAND_H
#define FREEHAND_H
#include"Resource/figure.h"
#include
#include

class FreeHand : public Figure
{
public:
    FreeHand();
    FreeHand( QPainterPath paths);

    void Draw(QPainter &paint);
//    void addPoint(QPoint point);

    ~FreeHand();

private:

  QPainterPath path;
//  QVector points;
};

#endif // FREEHAND_H

freehand.cpp

#include "Resource/freehand.h"
#include 
#include 
#include 
FreeHand::FreeHand(QPainterPath paths)
{
    path = paths;
}

void FreeHand::Draw(QPainter& paint)
{
    paint.drawPath(path);
}

FreeHand::~FreeHand()
{

}

polygon.h

#ifndef POLYGON_H
#define POLYGON_H
#include "Resource/figure.h"
#include

using namespace std;

class Polygon : public Figure
{
public:
    Polygon();
    Polygon(const vector<QPoint> points);

   void Draw(QPainter& paint);
    ~Polygon();

private:
    vector<QPoint> point;

};

#endif // POLYGON_H

polygon.cpp

#include "Resource/polygon.h"
#include 
#include 

using namespace std;

Polygon::Polygon()
{

}

Polygon::Polygon(const vector<QPoint> points)
{
    point = points;
}

void Polygon::Draw(QPainter &paint)
{
   paint.drawPolygon(&point.at(0),point.size());
}

Polygon::~Polygon()
{

}



好了,以上是这个程序的代码,我是第一次写博客,也不知道怎么说,就直接贴代码了。


你可能感兴趣的:(Qt练习)