gpt4 book ai didi

c++ - 如何使用点在 QPixmap 上画线

转载 作者:行者123 更新时间:2023-11-30 02:43:38 25 4
gpt4 key购买 nike

我的 GUI 中有一个标签,将图像显示为 QPixmap。我希望能够通过简单地单击图像上的任意位置以选择起点,然后通过单击图像的其他部分在其他地方绘制第二个点,从而在我的图像上绘制一条连续线。这两个点应该在放置第二个点后立即连接,我希望能够通过在图像上放置更多点来继续同一条线。

虽然我知道如何在 QPixmap 上绘制一些东西,但我需要使用鼠标事件来获取点的坐标,这让我很困惑,因为我对 还是很陌生>Qt.

如有任何解决方案示例,我们将不胜感激。

最佳答案

我建议您为此目的使用QGraphicsView。使用我的完美运行的代码片段。

子类QGraphicsScene:

#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H

#include <QGraphicsScene>
#include <QPoint>
#include <QMouseEvent>
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
explicit GraphicsScene(QObject *parent = 0);

signals:

protected:
void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);

public slots:
private:

QPolygon pol;

};

#endif // GRAPHICSSCENE_H

.cpp 文件:

#include "graphicsscene.h"
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QPainter>

GraphicsScene::GraphicsScene(QObject *parent) :
QGraphicsScene(parent)
{
addPixmap(QPixmap("G:/2/qt.jpg"));//your pixmap here
}

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
//qDebug() << "in";
if (mouseEvent->button() == Qt::LeftButton)
{

QPoint pos = mouseEvent->scenePos().toPoint();
pol.append(pos);
if(pol.size() > 1)
{
QPainterPath myPath;
myPath.addPolygon(pol);
addPath(myPath,QPen(Qt::red,2));
}
}
}

用法:

#include "graphicsscene.h"
//...
GraphicsScene *scene = new GraphicsScene(this);
ui->graphicsView->setScene(scene);
ui->graphicsView->show();

结果:

enter image description here

如果你想将新的像素图(或只是获取像素图)保存为图像,请使用此代码:

QPixmap pixmap(ui->graphicsView->scene()->sceneRect().size().toSize());
QString filename("example.jpg");
QPainter painter( &pixmap );
painter.setRenderHint(QPainter::Antialiasing);
ui->graphicsView->scene()->render( &painter, pixmap.rect(),pixmap.rect(), Qt::KeepAspectRatio );
painter.end();

pixmap.save(filename);

使用 render(),您还可以抓取场景的不同区域。

但是这段代码可以更好:我们创建和绘制相同的多边形。如果我们能记住最后绘制的点,那么我们就可以逐行绘制(行的开头是最后一行的结尾)。在这种情况下,我们不需要所有的点,我们只需要最后一点。

正如我所 promise 的(代码改进):只需提供额外的变量 QPoint last; 而不是 QPolygon pol; 并使用下一个代码:

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
//qDebug() << "in";
if (mouseEvent->button() == Qt::LeftButton)
{

QPoint pos = mouseEvent->scenePos().toPoint();
if(last.isNull())
{
last = pos;
}
else
{
addLine(QLine(last,pos),QPen(Qt::red,2));
last = pos;
}
}
}

如您所见,您只存储最后一个点并只绘制最后一条线。用户可以点击数千次,现在您不需要存储这些不必要的点并进行不必要的重绘。

关于c++ - 如何使用点在 QPixmap 上画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com