Qt鼠标/触摸画线,实现笔锋

鼠标画线十几年前就搞过, 但是随着硬件升级, 以前的代码明显有心无力, 在4K屏上卡的一逼。 而且人们的需求也水涨船高, 不再满足于随便的画线, 还要实现笔锋。眼看糊弄不过去了, 这不是逼老夫出绝招么!嘿嘿

网上搜了一大把没用的文章和代码, 终于有一篇靠个边, 也大概只讲原理, 贴了一点无关紧要的代码, 核心代码所谓没整理就不上传了, 无语。。。

那就自己研究吧, 其实实现笔锋本身不难, 但是要考虑性能, 就不是1+1的问题了。 这篇文章不展开性能相关的问题, 只是把我做的实现了笔锋功能的demo展示一下。

核心思想其实并不是什么贝塞尔曲线, 如果加上贝塞尔曲线只会让画线更卡, 核心思想其实就是在画线的一系列点的最后一部分点, 让线的宽度逐渐收缩, 就有了笔锋的效果:

void DrawCanvasWidget::drawCurve()
{
    *m_pix = m_tmppix.copy();
    QPainter painter(m_pix);
    QColor clr(255, 0, 0);
    QPen pen(clr);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::RoundJoin);
    painter.setPen(pen);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //抗锯齿和使用平滑转换算法
 
    int count = m_lspt.count();
    for(int i = 0; i < count - 1; i++)
    {
        QPoint pt1 = m_lspt[i]->m_pt;
        QPoint pt2 = m_lspt[i+1]->m_pt;
        pen.setWidth(m_lspt[i]->size);
        painter.setPen(pen);
        painter.drawLine(pt1, pt2);
    }
}

这里只是简单的demo, 不过也使用了双缓冲, 也就是画线并不是直接画到屏幕上的, 而是先画到后台创建的一个QPixmap上, 这个QPixmap要和窗口一样大。

完整工程代码可以去以下链接下载:

https://download.csdn.net/download/u010947464/88788622

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值