在QLabel中绘制可缩放的QPixmap

时间:2014-02-28 14:08:29

标签: c++ qt

我的目的是提供一个小部件,我可以在其中显示图像,单击此图像上的任意位置并显示我单击的位置。 为此,我使用了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());
}

正如您所见,我在缩放完成后绘制了十字架。

1 个答案:

答案 0 :(得分:0)

问题是你要画十字架然后缩放,然后你应该放大然后画画。

label->setPixmap(paintedPixmap);

将缩放paintedPixmap 您的十字架已经在pixmap上绘制 。您可以修改drawGCP,如下所示:

  1. 使用 标签维度
  2. 创建paintedPixmap
  3. 使用比例因子
  4. 调整位置int x, int y
  5. 使用新坐标在paintedPixmap上绘制十字架。
  6. 基本上

    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);
    }