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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值