【发布时间】:2012-03-13 08:04:54
【问题描述】:
我们知道,在 qt 中绘制图像时,会使用 qpainter。最近,我使用 drawLine() 函数来绘制用户正在涂鸦的任何内容。这是通过将来自 mouseMoveEvent 的 lastPoint 和 currentPoint 传递给实现 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-painting 的源代码,发现 drawLine() 正在调用 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();
}
【问题讨论】:
-
什么是drawLineTo?你怎么知道“像素丢失”?你为什么要打扰这些事情?
-
@UmNyobe,我在上面进行了编辑,显示了 drawLineTo 定义,我知道在 mouseMoveEvent() 中的 qDebug() 的帮助下绘制时像素丢失了。你看,如果我们画一条直线,那么这条线中的所有像素都应该被正确跟踪,但是有些像素被跳过了,我相信这是因为调用时发生了 user->kernel 和 kernel->user 切换画家引擎在图像上绘图。我对此感到困扰,因为我很想知道 drawLine() 是如何在两者之间添加像素
-
缺少像素是什么意思?您期望得到 qith qDebug 什么?您得到了什么?
-
@webclectic,我画了一条直线,比如从 (10,10) 到 (100,10) (不完全是直线,但是是的,它看起来像一条直线),以及像素正如我在上面的评论中所说的那样,绘制的不是连续的,我认为这是因为函数调用开销。因此,不是在 (10,10) 到 (100,10) 之间获取所有“绘制”像素,而是在 mouseMoveEvent 发生时没有跟踪一些像素。当我们在图像上涂鸦时,是否可以获取所有“绘制”的像素值?