我的目的是提供一个小部件,我可以在其中显示图像,单击此图像上的任意位置并显示我单击的位置。 为此,我使用了Qt's image viewer example。我点击时添加了一个在像素图上绘制的方法:
void drawGCP(int x, int y)
{
// paint on a "clean" pixmap and display it
// origPixmap is the pixmap with nothing drawn on it
paintedPixmap = origPixmap.copy();
QPainter painter(&paintedPixmap);
painter.setPen(Qt::red);
painter.drawLine(x - lineLength, y, x+lineLength, y);
painter.drawLine(x, y - lineLength, x, y + lineLength);
label->setPixmap(paintedPixmap);
}
它完美无缺。当我放大时会出现问题。标签已调整大小,我不知道如何在图像中添加某种模糊。 这就是我想要的。但是,我绘制的十字架也是模糊的,线条有几个屏幕像素宽。我希望十字架总是1像素宽。
我尝试用QGraphicsView和QGraphicsPixmapItem做同样的事情。 QGraphicsView有一个内置的缩放,但这里没有应用模糊。
如何在可缩放的QLabel显示的QPixmap上绘制1像素宽的线?
更新 以下是我如何称之为drawGCP:
void ImageGCPPicker::scaleImage(double factor)
{
scaleFactor *= factor;
if (scaleFactor < MIN_ZOOM)
{
scaleFactor /= factor;
return;
}
if (scaleFactor > MAX_ZOOM)
{
scaleFactor /= factor;
return;
}
horizontalScrollBar()->setValue(int(factor * horizontalScrollBar()->value() + ((factor - 1) * horizontalScrollBar()->pageStep()/2)));
verticalScrollBar()->setValue(int(factor * verticalScrollBar()->value() + ((factor - 1) * verticalScrollBar()->pageStep()/2)));
label->resize(scaleFactor * label->pixmap()->size());
drawGCP(GCPPos.x(), GCPPos.y());
}
正如您所见,我在缩放完成后绘制了十字架。
答案 0 :(得分:0)
问题是你要画十字架然后缩放,然后你应该放大然后画画。
label->setPixmap(paintedPixmap);
将缩放paintedPixmap
, 您的十字架已经在pixmap上绘制 。您可以修改drawGCP
,如下所示:
paintedPixmap
int x, int y
paintedPixmap
上绘制十字架。基本上
void drawGCP(int x, int y, double factor)
{
//redundant with factor
bool resizeneeded = (label->size() != origPixmap(size));
paintedPixmap = resizeneeded ? origPixmap.scaled(label->size()) : origPixmap.copy() ;
QPainter painter(&paintedPixmap);
painter.setPen(Qt::red);
//adjust the coordinates (can be done when passing parameters)
x *= factor;
y *= factor;
painter.drawLine(x - lineLength, y, x+lineLength, y);
painter.drawLine(x, y - lineLength, x, y + lineLength);
//will not scale pixmap internally
label->setPixmap(paintedPixmap);
}