如何在使用DrawLine时追踪丢失的像素 [英] How to trace the missing pixels when using drawLine

查看:34
本文介绍了如何在使用DrawLine时追踪丢失的像素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们知道,要在qt中的图像上绘制,需要使用qaint ter。最近,我使用draLine()函数来绘制用户正在涂鸦的任何内容。这是通过将lastPoint和currentPoint从MouseMoveEvent传递给实现DrawLine()的自定义函数来实现的。我已经传递了该自定义函数的参数,如下所示:

void myPaint::mouseMoveEvent(QMouseEvent *event) {  
qDebug() << event->pos();
   if ((event->buttons() & Qt::LeftButton) && scribbling) {
    pixelList.append(event->pos());
    drawLineTo(event->pos());
    lastPoint = event->pos();
   }
}

现在,在qDebug()的帮助下,我注意到在绘制时丢失了一些像素,但绘制是精确的。我查找了qt-aint的源代码,在那里我看到draLine()正在调用DrawLines(),后者正在利用qpainterPath在图像上绘制一个形状。

我的问题是,有没有办法追踪这些"丢失的"像素,或者有什么方法可以找到所有已经绘制的像素?

谢谢!

void myPaint::drawLineTo(const QPoint &endPoint) {    
QPainter painter(image); //image is initialized in the constructor of myPaint
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(Qt::blue, myPenWidth, Qt::SolidLine, Qt::RoundCap,Qt::RoundJoin));
painter.drawLine(lastPoint, endPoint);
modified = true;
lastPoint = endPoint; //at the mousePressEvent, the event->pos() will be stored as
                      // lastPoint 
update();
}

推荐答案

首先,不要画出mouseEvent()。实际上,处理鼠标事件应该尽可能快地完成。此外,查看Qt源代码也不是一个好主意,它可能会令人困惑。相反,假设Qt为您提供了工作,并首先尝试回答"我做错了什么?"正如我所说的,在鼠标事件中绘制绝对是错误的。

您的描述真的很主观,也许输出的图像更好。你是在试图模仿钢笔(就像Windows Paint中的那样)吗?在这种情况下,鼠标按钮是否必须按下?这是您的变量scribbling的目的吗?

还有更多。按照文档说明,QMouseEvent::buttons()始终返回鼠标移动事件的所有按钮的组合。这是有道理的:鼠标的移动与按钮无关。意思是

if ((event->buttons() & Qt::LeftButton)

将始终为真。

假设您想在按下左键时绘制鼠标的路径。然后使用如下内容:

void myPaint::mousePressEvent(QMouseEvent *event){
     scribbling = true;
     pixelList.clear();
}

void myPaint::mouseReleaseEvent(QMouseEvent *event){
     scribbling = false;
}

void myPaint::mouseMoveEvent(QMouseEvent *event) {  
  if ( scribbling) {
    pixelList.append(event->pos());
  }
}

void myPaint::paintEvent(){
  QPainter painter(this)
  //some painting here
  if ( scribbling) {
     painter.setRenderHint(QPainter::Antialiasing);
     painter.setPen(QPen(Qt::blue, myPenWidth, Qt::SolidLine, Qt::RoundCap,Qt::RoundJoin));
    // here draw your path
    // for example if your path can be made of lines, 
    // or you just put the points if they are close from each other
  }

  //other painting here
}

如果完成所有这些操作后渲染效果不佳,请尝试使用浮动精度(较慢),即QMouseEvent::posF()而不是QMouseEvent::pos()

编辑:
"我想知道是否有办法计算我们作为参数发送给DrawLine的任意两个像素之间的所有子像素"
是的有。我不知道你为什么要做这样的事情,但这真的很简单。直线可以用等式来刻画

   y = ax + b
直线p0 = (x0, y0)p1 = (x1, y1)的两个端点都满足此等式,因此您可以很容易地找到ab。现在,您需要做的就是将x0递增到x1 像素,并计算相应的y值,每次节省point(x,y)

因此将遍历pixelList中保存的所有点,并对任意两个连续的点重复此过程。

这篇关于如何在使用DrawLine时追踪丢失的像素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆