Qt学习(二)-Qt类的提升

最近想在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版权协议,转载请附上原文出处链接和本声明。