Qt下加载图片,在图片上绘制多边形,移动鼠标拉伸多边形

来源:互联网 发布:c语言调用exe文件 编辑:程序博客网 时间:2024/06/08 11:22

本实例是绘制梯形,拖动四个顶点可以拉伸图形

编译环境为 Win7–Qt5.4
1.新建Application工程项目,命名为TiXing,基类选择QWidget;
2.在widget.h的头文件中添加以下声明:

private:    int j;    int m_dragging;    int X[4]={50,200,300,50},Y[4]={100,100,200,200};protected:    void mouseReleaseEvent(QMouseEvent*event);    void mousePressEvent(QMouseEvent*event);    void mouseMoveEvent(QMouseEvent*event);    void paintEvent(QPaintEvent *event);

3.然后再widget.cpp文件中添加头文件:

#include <QPainter>#include <QMouseEvent>#include <QWidget>#include <QPen>#include<QDebug>

继续添加函数定义:

void Widget::paintEvent(QPaintEvent *event) {    QPainter paint(this);    QImage image;    image.load("../POLYGON/MyDrawing/luo.jpg");    qDebug() << image.size() << image.format() <<  image.depth();    paint.drawImage(QPoint(0, 0), image);    paint.setPen(QPen(Qt::blue,5));    for(int i=0;i<4;i++)      paint.drawPoint(X[i],Y[i]);    paint.setPen(Qt::red);    QPolygon pts;    pts.setPoints(4, X[0],Y[0], X[1],Y[1], X[2],Y[2],X[3],Y[3]);    paint.drawConvexPolygon(pts);}void Widget::mouseReleaseEvent(QMouseEvent *event){        m_dragging = 0;}void Widget::mousePressEvent(QMouseEvent *event){  for(int i=0;i<4;i++)  {      if(event->pos().x()==X[i]&&event->pos().y()==Y[i])       {  m_dragging = 1;          j=i;          break;        }      else continue;  }}void Widget::mouseMoveEvent(QMouseEvent *event){  if (m_dragging==1)     {        X[j]=event->pos().x();        Y[j]=event->pos().y();        update();      }}

4.运行结果如下:
这里写图片描述

附上文件代码:

widget.h-------------------------------------------------------#ifndef WIDGET_H#define WIDGET_H#include <QWidget>namespace Ui{class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();private:    Ui::Widget *ui;   // int a;   // int b;     int j;    int m_dragging;    int X[4]={50,200,300,50},Y[4]={100,100,200,200};protected:    void mouseReleaseEvent(QMouseEvent*event);    void mousePressEvent(QMouseEvent*event);    void mouseMoveEvent(QMouseEvent*event);    void paintEvent(QPaintEvent *event);};#endif // WIDGET_Hwidget.cpp-------------------------------------------------------#include "widget.h"#include "ui_widget.h"#include <QPainter>#include <QMouseEvent>#include <QWidget>#include <QPen>#include<QDebug>Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    m_dragging = 0;    ui->setupUi(this);    resize(500,514);    setWindowTitle(tr("polygon"));}Widget::~Widget(){    delete ui;}void Widget::paintEvent(QPaintEvent *event) {    QPainter paint(this);    QImage image;    image.load("../POLYGON/MyDrawing/luo.jpg");    qDebug() << image.size() << image.format() << image.depth();    paint.drawImage(QPoint(0, 0), image);    paint.setPen(QPen(Qt::blue,5));    for(int i=0;i<4;i++)      paint.drawPoint(X[i],Y[i]);    paint.setPen(Qt::red);    QPolygon pts;    pts.setPoints(4, X[0],Y[0], X[1],Y[1], X[2],Y[2],X[3],Y[3]);    paint.drawConvexPolygon(pts);}void Widget::mouseReleaseEvent(QMouseEvent *event){        m_dragging = 0;}void Widget::mousePressEvent(QMouseEvent *event){  for(int i=0;i<4;i++)  {      if(event->pos().x()==X[i]&&event->pos().y()==Y[i])       {  m_dragging = 1;          j=i;          break;        }      //else continue;  }}void Widget::mouseMoveEvent(QMouseEvent *event){  if (m_dragging==1)     {        X[j]=event->pos().x();        Y[j]=event->pos().y();        update();      }}
0 0