QGraphicsSceneMouseEvent 获取位置将不起作用[重复]

Posted

技术标签:

【中文标题】QGraphicsSceneMouseEvent 获取位置将不起作用[重复]【英文标题】:QGraphicsSceneMouseEvent get position will not work [duplicate] 【发布时间】:2019-10-07 11:35:02 【问题描述】:

我正在尝试制作一个包含 QGraphicsView 的应用程序。当使用 QGraphicsSceneMouseEvent 按下鼠标时,我试图获取鼠标的位置,但它似乎不起作用。当我按下鼠标时,永远不会调用整个函数。

我想制作一个可以将图像加载到 QGraphicsView 中的应用程序,然后当您按下鼠标按钮时,它应该添加一个小圆圈。

这是我的代码:

dialog.cpp:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)

    ui->setupUi(this);
    ui->graphicsView = new GraphicsView();


Dialog::~Dialog()

    delete ui;

graphicsview.h:

#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
#include <QMouseEvent>
#include <QDebug>

class GraphicsView : public QGraphicsView

public:
    GraphicsView();
protected:
    void mousePressEvent(QMouseEvent *event) override;

private:
    QGraphicsScene *scene;
;

#endif // GRAPHICSVIEW_H

graphicsview.cpp:

#include "graphicsview.h"

GraphicsView::GraphicsView()

    scene = new QGraphicsScene();
    this->setScene(scene);


void GraphicsView::mousePressEvent(QMouseEvent *event)

    if(event->button() == Qt::LeftButton)
    
        qDebug() << "The left button was pressed!";
    

【问题讨论】:

您是否...:在QGraphicsView 上启用鼠标跟踪?连接信号正确吗?在您发布的函数中找到内存泄漏(提示:doc.qt.io/qt-5/qgraphicsscene.html#addEllipse)? 作为附加问题:您的scene 如何调用函数Dialog::mousePressEvent @Zaiborg 我刚刚编辑了我的帖子并包含了对话框类中的所有代码 不是一个答案,但您可能会希望 event-&gt;scenePos() 从您在代码中使用位置的方式。即x = int(event-&gt;scenePos().x());y 相同。 事实上,我认为你应该通过继承QGraphicsScene 来重新实现它。在QGraphicsScene 的文档中,其受保护的mousePressEventvirtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)(即输入变量的类型是QGraphicsSceneMouseEvent,而不是大多数类中通常的QMouseEvent),这意味着图形场景的鼠标事件是这样的应该实施。由于你的类继承了QDialog,这可能是它不起作用的原因。 【参考方案1】:

你快到了。

只需将GraphicsView::GraphicsView() 更改为:

GraphicsView::GraphicsView(QWidget *parent=nullptr) : QGraphicsView(parent) 

并将ui-&gt;graphicsView = new GraphicsView(); 更改为

QVBoxLayout *verticalLayout = new QVBoxLayout(this);
verticalLayout->addWidget(new GraphicsView(this));

这将使图形视图成为对话框的父级。添加上面的代码时,请确保您的对话框中没有任何内容。或者,您可以在 dialog.ui 文件中为对话框添加垂直布局并执行

ui->verticalLayout->addWidget(new GraphicsView(this));

我相信这可以解决您的问题。如果您仍有任何问题,请回复。

确保您始终有一个父参数。没有它,你就不会告诉你的程序应该在哪里添加你的小部件。

【讨论】:

非常感谢,我试试看

以上是关于QGraphicsSceneMouseEvent 获取位置将不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsSceneMouseEvent 获取位置将不起作用[重复]

QGraphicsScene 中的 QPushButton 需要双击而不是单击

如何在 QML 中模拟鼠标点击?

无法在鼠标光标下准确地在 QGraphicsScene 上绘制新项目