gpt4 book ai didi

c++ - qt在图形 View 中获取鼠标相对于图像的单击位置

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:14 25 4
gpt4 key购买 nike

我想允许用户使用鼠标在图像上画线,我正在使用图形 View 和鼠标事件,但我得到的位置相对于图像不正确这里是鼠标事件函数

void InitializationDialog::mousePressEvent(QMouseEvent *event) {
if(drawing) {
points.append(event->pos());
if(!points.isEmpty()) {
if(points.size()==1) {
QString fileName = list.at(choosed);
QImage image(fileName);
QGraphicsScene* scene = new QGraphicsScene();
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
scene->addItem(item);
QColor color(255,0,0);
QBrush brush(color);
QPen pen(brush, 4);
QGraphicsLineItem* line = new QGraphicsLineItem(points.at(0).x(),points.at(0).y(),points.at(0).x()+1,points.at(0).y()+1);
line->setPen(pen);
scene->addItem(line);

ui->graphicsView->setScene(scene);
return;
}
}
}
}

那应该画一个点(我用一像素长的线代替它看起来像一个点)

现在我得到了远离鼠标点击的红点,如图中所示 enter image description here

如何使它准确地位于鼠标光标上?

编辑:

我为图形场景制作了一个自定义类以获得相对于它的点击,我尝试覆盖图形 View 的鼠标按下但场景与图形 View 的大小不同并且鼠标点击仍然远离鼠标

在我的自定义场景中覆盖鼠标按下并没有太大帮助,因为无论我点击哪里,我总是获得 0,0 位置来点击场景

新文件代码:

头文件

#ifndef INITGRAPH_H
#define INITGRAPH_H
#include <QtGui>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPoint>
#include <QGraphicsSceneMouseEvent>
class InitGraph : public QGraphicsView {
Q_OBJECT
public:
InitGraph(QWidget *parent = 0);
virtual ~InitGraph() {};
};

class CustomScene : public QGraphicsScene {
Q_OBJECT
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
signals:
void pressed(QPoint p);
};
#endif // INITGRAPH_H

源文件

#include "initgraph.h"
InitGraph::InitGraph(QWidget *parent):QGraphicsView(parent)
{
}
void CustomScene::mousePressEvent(QGraphicsSceneMouseEvent *event){
qDebug(QString::number(event->pos().rx()).toLatin1());
QPoint p = event->pos().toPoint();
emit pressed(p);
}

最佳答案

如果你想添加一个QGraphicsLineItem你必须使用场景的系统坐标你必须使用QGraphicsSceneMouseEvent的scenePos()方法 和项目的方法 mapFromScene()

为此,我们必须覆盖 QGraphicsScene 的方法 mousePressEventmouseMoveEventmouseReleaseEvent,以上所有我在下面的类中实现了它:

class CustomScene : public QGraphicsScene
{
Q_OBJECT
QGraphicsLineItem *item;
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event){

item = new QGraphicsLineItem;
addItem(item);
const QPointF p = event->scenePos();

item->setPos(p);
}

void mouseMoveEvent(QGraphicsSceneMouseEvent *event){
const QPointF p =item->mapFromScene(event->scenePos());
QLineF l = item->line();
l.setP2(p);
item->setLine(l);
}

void mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
const QPointF p =item->mapFromScene(event->scenePos());
QLineF l = item->line();
l.setP2(p);
item->setLine(l);
}

};

完整代码在下面link .

关于c++ - qt在图形 View 中获取鼠标相对于图像的单击位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46049009/

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