Qt桌面白板工具其一(解决曲线不平滑的问题——贝塞尔曲线)

本文详细介绍了如何使用Qt实现桌面白板工具,特别是通过贝塞尔曲线解决线条不平滑和卡顿问题。作者分析了QGraphicsView与QImage两种实现方式的优缺点,并分享了利用贝塞尔曲线算法优化平滑绘制的思路,包括点的过滤、中点插入以及QPainterPath的使用。同时,作者探讨了卡顿的原因,提出了多线程绘制以减轻主线程负担的解决方案,并讨论了透明度处理和绘图效率之间的权衡。文章最后提出了一种新的绘制思路,即通过锁定像素和设置合成模式来优化半透明线条的绘制效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt桌面白板工具其一(解决曲线不平滑的问题——贝塞尔曲线)

前言:

有关Qt的绘画、白板、画板等应用,前前后后研究过好几次,每一次都有新的收获和体会。而这次终于研究明白,如何解决因为电脑配置应用卡顿所导致的线条折线明显、存在卡顿的问题。是的,网上说的都是贝塞尔曲线,但研究半天没有很明确地解决我的需求,所以这里我也结合了自己的思考,给出以下的解决方法和代码吧。

一、核心实现代码

我们首先要在mousePressEvent和mouseMoveEvent里面收集我们的鼠标点击移动点,或者触摸屏的移动点。

void BezierTestWidget::mousePressEvent(QMouseEvent *event)
{
   
    if(flag_bezier)
    {
   
        bezier_points.clear();
        bezier_points.append(event->pos());
    }
}

void BezierTestWidget::mouseMoveEvent(QMouseEvent *event)
{
   
    if((event->buttons() & Qt::LeftButton))//是否左击
    {
   
        QImage image = last_image;
        if(flag_bezier)
        {
   
            //采集点的时候,适当过滤一下比较接近的一些点,不然会影响平滑处理的效果
            if(qAbs(bezier_points.last().x()-event->pos().x())>15 || qAbs(bezier_points.last().y()-event->pos().y())>15)
            {
   
                bezier_points.append(event->pos());
            }

            QPainter painter(&image);
            painter.setRenderHint(QPainter::Antialiasing, true);

            QPen pen;
            QColor brush_color(0,255,0,100);
            pen.setBrush(brush_color);
            pen.setWidth(5);
            painter.setPen(pen);

            drawBezier(&painter, &image);
            painter.end();
        }

        *draw_image = image;
        repaint();
    
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值