Qt绘图事件

使用场景:

绘图软件、自绘界面、自定义组件等

相关类:

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();
        }
    }
}

你可能感兴趣的:(QT,qt,开发语言)