我想让用户使用鼠标在图像上画线, 我使用图形视图和鼠标事件,但我得到的位置不是相对于图像的正确位置 这是鼠标事件功能
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;
}
}
}
}
那应该画一点(我用一条像素的长线替换它看起来像一个点)
如何在鼠标光标上精确制作?
编辑:
我为图形场景制作了一个自定义类来获取相对于它的点击,我尝试重写鼠标按下图形视图,但场景与图形视图的大小不同,点仍然远离鼠标点击
在我的自定义场景中按下鼠标是没有多大帮助的,因为无论我在哪里点击该场景,我都会获得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);
}
答案 0 :(得分:2)
如果你想添加QGraphicsLineItem
,你必须使用场景的系统坐标,你必须使用scenePos()
QGraphicsSceneMouseEvent
方法和方法{{1}这些项目。
为此,我们必须覆盖mapFromScene()
的方法mousePressEvent
,mouseMoveEvent
和mouseReleaseEvent
,以上所有内容我都在以下类中实现:
QGraphicsScene
完整代码位于以下link。
答案 1 :(得分:1)
由于您正在重载对话框的鼠标事件,因此您在对话框坐标中具有鼠标位置。最好使用绘图小部件事件让Qt为您进行所有对话,并且不会过滤对话区域。
为了使其真正可重用,您可以实现QGraphicsItem Drawable子类并处理添加或编辑子项的鼠标事件。
修改强> 这是一个适合您的工作示例qt-drawable-item-example
简言之:
void DrawableItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
m_activePath = new QGraphicsPathItem(this);
m_activePath->setPen(QPen(Qt::GlobalColor(rand()%17+2), 2.0));
m_activePath->setPath(QPainterPath(event->pos()));
}
void DrawableItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
if(!m_activePath) {
QGraphicsItem::mouseMoveEvent(event);
return;
}
auto path = m_activePath->path();
path.lineTo(event->pos());
m_activePath->setPath(path);
}
void DrawableItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
if(!m_activePath) {
QGraphicsItem::mouseReleaseEvent(event);
return;
}
m_activePath = nullptr;
}
答案 2 :(得分:1)
您正在接收点击InitializationDialog但不在您的graphicsView上的位置,因此您需要通过最少使用您的graphicsView的x和y来转换此位置
QGraphicsLineItem* line = new QGraphicsLineItem(
points.at(0).x()-graphicsView->rect().x(),
points.at(0).y()-graphicsView->rect().y(),
points.at(0).x()+1, points.at(0).y()+1);