鼠标画线十几年前就搞过, 但是随着硬件升级, 以前的代码明显有心无力, 在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要和窗口一样大。
完整工程代码可以去以下链接下载: