使用场景:
绘图软件、自绘界面、自定义组件等
相关类:
QMouseEvent、QPainter、QPixmap、QPen等
声明要重写的函数:
h
protected:
void paintEvent(QPaintEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
例中绘图是在QPixmap上进行的,所以需要创建QPixmap对象
cpp
void MainScreen::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
//声明两个QPoint成员函数,一个表示起始点(鼠标按下),一个表示终止点(鼠标弹起)
int x,y,w,h;
x=lastPoint.x();
y=lastPoint.y();
w=endPoint.x()-x;
h=endPoint.y()-y;
QPainter painter(this);
pen.setWidth(penwidth);//设置画笔粗细
pen.setColor(pencolor);//设置画笔颜色
if(isDrawing)//isDrawing表示正在绘制中(鼠标未弹起),实时显示绘图轨迹
{
temPix=pixmap;
QPainter pp(&temPix);
pp.setPen(pen);
if(IsEllipse)//用来判定是画圆还是画矩形的布尔类型
pp.drawEllipse(x,y,w,h);//绘制圆
else
pp.drawRect(x,y,w,h);//绘制矩形
painter.drawPixmap(0,0,temPix);
}
else //显示最终图像
{
QPainter pp(&pixmap);
pp.setPen(pen);
if(IsEllipse)
pp.drawEllipse(x,y,w,h);
else
pp.drawRect(x,y,w,h);
painter.drawPixmap(0,0,pixmap);
}
}
void MainScreen::mousePressEvent(QMouseEvent *event)
{//左键按下,记录起始点位置为当前位置,开始绘图
if(event->button()==Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
lastPoint=event->pos();
endPoint=lastPoint;
isDrawing=true;
}
}
}
void MainScreen::mouseMoveEvent(QMouseEvent *event)
{//鼠标已按下并移动,实时刷新当前绘图效果
if(event->buttons()&Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
endPoint=event->pos();
update();
}
}
}
void MainScreen::mouseReleaseEvent(QMouseEvent *event)
{//鼠标弹起,绘图结束,记录当前位置为终止点
if(event->button()==Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
isChange=true;
endPoint=event->pos();
isDrawing=false;
update();
}
}
}
————————————————
不定期发布原创文章,软件设计,桌面应用,上位机,毕业设计可私信。
绘图软件、自绘界面、自定义组件等
相关类:
QMouseEvent、QPainter、QPixmap、QPen等
声明要重写的函数:
h
protected:
void paintEvent(QPaintEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
例中绘图是在QPixmap上进行的,所以需要创建QPixmap对象
cpp
void MainScreen::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
//声明两个QPoint成员函数,一个表示起始点(鼠标按下),一个表示终止点(鼠标弹起)
int x,y,w,h;
x=lastPoint.x();
y=lastPoint.y();
w=endPoint.x()-x;
h=endPoint.y()-y;
QPainter painter(this);
pen.setWidth(penwidth);//设置画笔粗细
pen.setColor(pencolor);//设置画笔颜色
if(isDrawing)//isDrawing表示正在绘制中(鼠标未弹起),实时显示绘图轨迹
{
temPix=pixmap;
QPainter pp(&temPix);
pp.setPen(pen);
if(IsEllipse)//用来判定是画圆还是画矩形的布尔类型
pp.drawEllipse(x,y,w,h);//绘制圆
else
pp.drawRect(x,y,w,h);//绘制矩形
painter.drawPixmap(0,0,temPix);
}
else //显示最终图像
{
QPainter pp(&pixmap);
pp.setPen(pen);
if(IsEllipse)
pp.drawEllipse(x,y,w,h);
else
pp.drawRect(x,y,w,h);
painter.drawPixmap(0,0,pixmap);
}
}
void MainScreen::mousePressEvent(QMouseEvent *event)
{//左键按下,记录起始点位置为当前位置,开始绘图
if(event->button()==Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
lastPoint=event->pos();
endPoint=lastPoint;
isDrawing=true;
}
}
}
void MainScreen::mouseMoveEvent(QMouseEvent *event)
{//鼠标已按下并移动,实时刷新当前绘图效果
if(event->buttons()&Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
endPoint=event->pos();
update();
}
}
}
void MainScreen::mouseReleaseEvent(QMouseEvent *event)
{//鼠标弹起,绘图结束,记录当前位置为终止点
if(event->button()==Qt::LeftButton)
{
if((event->pos().x()<800)&&(event->pos().y()<600))
{
isChange=true;
endPoint=event->pos();
isDrawing=false;
update();
}
}
}
————————————————
不定期发布原创文章,软件设计,桌面应用,上位机,毕业设计可私信。