如何在使用DrawLine时追踪丢失的像素 [英] How to trace the missing pixels when using 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)
的两个端点都满足此等式,因此您可以很容易地找到a
和b
。现在,您需要做的就是将x0
递增到x1
像素,并计算相应的y
值,每次节省point(x,y)
。
因此将遍历pixelList
中保存的所有点,并对任意两个连续的点重复此过程。
这篇关于如何在使用DrawLine时追踪丢失的像素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!