【发布时间】: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->scenePos()从您在代码中使用位置的方式。即x = int(event->scenePos().x());和y相同。 -
事实上,我认为你应该通过继承
QGraphicsScene来重新实现它。在QGraphicsScene 的文档中,其受保护的mousePressEvent是virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)(即输入变量的类型是QGraphicsSceneMouseEvent,而不是大多数类中通常的QMouseEvent),这意味着图形场景的鼠标事件是这样的应该实施。由于你的类继承了QDialog,这可能是它不起作用的原因。
标签: qt qgraphicsview qgraphicsscene