Qt QGraphicsview mouserelease事件未注册

Qt QGraphicsview mouserelease事件未注册,qt,mouseevent,qgraphicsview,Qt,Mouseevent,Qgraphicsview,我试图通过一个事件过滤器获得鼠标按下和鼠标放松事件的场景坐标。 它对鼠标垫很有效,但鼠标垫似乎没有注册 我错过了什么 请注意,我使用的是Qt Creator 2.2.0(基于Qt 4.7.4) class鼠标指针:公共QObject{ //Q_对象 受保护的: 布尔事件过滤器(QObject*obj,QEvent*event); }; 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); mouse

我试图通过一个事件过滤器获得鼠标按下和鼠标放松事件的场景坐标。 它对鼠标垫很有效,但鼠标垫似乎没有注册

我错过了什么

请注意,我使用的是Qt Creator 2.2.0(基于Qt 4.7.4)

class鼠标指针:公共QObject{
//Q_对象
受保护的:
布尔事件过滤器(QObject*obj,QEvent*event);
};
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
mouseEater*eater=新的mouseEater();
qgraphicscene*场景;
场景=新的qgraphicscene();
ui->view->installEventFilter(eater);
ui->view->setScene(场景);
}
bool mouseEater::eventFilter(QObject*obj,QEvent*event){
QMouseEvent*mEvent=静态_转换(事件);
QPoint point=mEvent->pos();

cout快速的答案是QGraphicsView似乎不允许其他QoObject吃掉它的mouseReleaseEvents。我还不知道为什么,但我认为这与mouseReleaseEvent()在QGraphicsView中的重新实现方式有关。不过,一点小小的黑客攻击提供了一个解决方法:

标题:

class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

protected:
  virtual bool eventFilter(QObject *, QEvent *);

private:
  Ui::MainWindow *ui;
};

class cDerived : public QGraphicsView
{
  Q_OBJECT

public:
  cDerived(QWidget *parent) : QGraphicsView(parent) {}

protected:
  virtual void mousePressEvent(QMouseEvent *event);
  virtual void mouseReleaseEvent(QMouseEvent *event);
};
资料来源:

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);

  QGraphicsView *View = new cDerived(ui->centralWidget);
  QGraphicsScene *Scene = new QGraphicsScene(ui->centralWidget->rect(), ui->centralWidget);
  View->setScene(Scene);
  View->installEventFilter(this);
}

MainWindow::~MainWindow()
{
  delete ui;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
  switch(event->type())
  {
  case QEvent::MouseButtonPress:

      qDebug()<<"eaten mousepress";
      return true;
      break;
  case QEvent::MouseButtonRelease:
      qDebug()<<"eaten mouserelease";
      return true;
      break;
  default:
      //standard event processing
      return QObject::eventFilter(obj, event);
      break;
  }
}

void cDerived::mousePressEvent(QMouseEvent *event)
{
  qDebug()<<"mousepress";
  event->ignore();
}

void cDerived::mouseReleaseEvent(QMouseEvent *event)
{
  qDebug()<<"mouserelease";
  event->ignore();
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QGraphicsView*视图=新的cDerived(ui->centralWidget);
qgraphicscene*Scene=newqgraphicscene(ui->centralWidget->rect(),ui->centralWidget);
查看->设置场景(场景);
查看->安装事件过滤器(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
bool主窗口::事件过滤器(QObject*obj,QEvent*event)
{
开关(事件->类型()
{
案例QEvent::鼠标按钮按下:
qDebug()使用等,而不是使用
QMouseEvent
。正如我在中发现的,qgraphicscene不会发送正常的鼠标事件


致以最诚挚的问候

不幸的是,如果我在场景中安装事件过滤器并将事件更改为QGraphicsSceneMouseEvent,我似乎无法获得任何有用的坐标。无论单击何处,坐标始终相同..您的QEvent to QGraphicsSceneMouseEvent转换成功了吗?您得到了什么样的坐标?您必须使用SetScenInstructure来匹配视图,因为它默认为两轴上的qreal对象(-1->+1),这可能会让一些人感到困惑。如果你需要这样的对象,那么你应该已经知道你需要进行适当的转换,但那是另一个问题。。。。
MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);

  QGraphicsView *View = new cDerived(ui->centralWidget);
  QGraphicsScene *Scene = new QGraphicsScene(ui->centralWidget->rect(), ui->centralWidget);
  View->setScene(Scene);
  View->installEventFilter(this);
}

MainWindow::~MainWindow()
{
  delete ui;
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
  switch(event->type())
  {
  case QEvent::MouseButtonPress:

      qDebug()<<"eaten mousepress";
      return true;
      break;
  case QEvent::MouseButtonRelease:
      qDebug()<<"eaten mouserelease";
      return true;
      break;
  default:
      //standard event processing
      return QObject::eventFilter(obj, event);
      break;
  }
}

void cDerived::mousePressEvent(QMouseEvent *event)
{
  qDebug()<<"mousepress";
  event->ignore();
}

void cDerived::mouseReleaseEvent(QMouseEvent *event)
{
  qDebug()<<"mouserelease";
  event->ignore();
}