最近想在widget界面上绘制区域,需要对widget类进行提升,从而对paintEvent事件进行重写,实现绘制效果。
(1)通过Qt designer拖拽出一个widget;
(1)右击此widget,选择“提升为”;
(3)填写类名,点击添加,提升。此时widget类会被提升为newWidget(自定义类名);
(4)在项目里添加对应的newwidget.h和newwidget.cpp文件,并对paintEvent事件进行重写,便会实现绘制效果
附上主要代码
newwidget.h
#ifndef NEWWIDGET_H
#define NEWWIDGET_H
#include <QWidget>
#include <QPen>
#include <QPainter>
#include <QMouseEvent>
#include <QPoint>
#include <math.h>
class newWidget : public QWidget
{
Q_OBJECT
public:
newWidget(QWidget *parent = 0);
~newWidget();
QMatrix m_Matrix;
protected:
void paintEvent(QPaintEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
private:
QPen m_drawPen;
QPoint m_Point;
std::vector<QPoint> temp;
std::vector<std::vector<QPoint>> pathvec;
QPainter* painter;
};
#endif // NEWWIDGET_H
newwidget.cpp
#include "newWidget.h"
newWidget::newWidget(QWidget *parent): QWidget(parent)
{
m_drawPen=QPen(Qt::yellow,20); //设置画笔属性
m_drawPen.setStyle(Qt::SolidLine);
this->setMouseTracking(true);
}
newWidget::~newWidget()
{
if(painter != NULL)
{
delete painter;
painter = NULL;
}
}
void newWidget::mouseMoveEvent(QMouseEvent* event)
{
setCursor(Qt::CrossCursor);
}
void newWidget::mousePressEvent(QMouseEvent* event)
{
setCursor(Qt::ArrowCursor);
if(event->button() == Qt::LeftButton) //按下鼠标左键
{
m_Point = event->pos();
temp.push_back(m_Point); //把当前点位push进路径容器中
pathvec.push_back(temp);
newWidget::update(); //触发绘制事件
}
else if(event->button() == Qt::RightButton)
{
painter->end(); //绘制结束
pathvec.push_back(temp);
temp.clear(); //路径容器清空,为下一次绘制做准备
newWidget::update();
}
else if(event->button() == Qt::MiddleButton)
{
pathvec.clear(); //按下鼠标中键,路径容器全部清空,删除绘制图像
newWidget::update();
}
}
void newWidget::paintEvent(QPaintEvent* event)
{
painter = new QPainter(this);
painter->setPen(m_drawPen);
m_drawPen.setWidth(2);
painter->setRenderHint(QPainter::Antialiasing);
painter->setRenderHint(QPainter::TextAntialiasing);
QPainterPath RoiPath;
int j = 0;
for(j=0;j<pathvec.size();j++)
{
for(int i=0;i<pathvec[j].size();i++)
{
if(i==0)
{
RoiPath.moveTo(m_Matrix.map(pathvec[j][i]));
RoiPath.addEllipse(m_Matrix.map(pathvec[j][i]),2,2);
}
else
{
RoiPath.lineTo(m_Matrix.map(pathvec[j][i]));
RoiPath.moveTo(m_Matrix.map(pathvec[j][i]));
RoiPath.addEllipse(m_Matrix.map(pathvec[j][i]),2,2);
}
}
}
eRoiPath.closeSubpath();
painter->drawPath(RoiPath);
}
版权声明:本文为qq_39298781原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。