QGraphicsview mouserelease событие не регистрируется - PullRequest
2 голосов
/ 11 октября 2011

Я пытаюсь получить координаты сцены для события мыши и отпускания мыши с помощью фильтра событий. Он хорошо работает при нажатии мыши, но, похоже, выпуск мыши не регистрируется.

Что мне здесь не хватает?

Обратите внимание, что я использую Qt Creator 2.2.0 (на основе Qt 4.7.4)

class mouseEater : public QObject{
// Q_OBJECT
protected:
 bool eventFilter(QObject *obj, QEvent *event);
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

mouseEater *eater = new mouseEater();

QGraphicsScene *scene;
scene = new QGraphicsScene();
ui->view->installEventFilter(eater);
ui->view->setScene(scene);
}

bool mouseEater::eventFilter(QObject *obj, QEvent *event){

QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);

QPoint point = mEvent->pos();

cout<<"type:"<<event->type()<<endl;

switch(event->type()){
case QEvent::MouseButtonPress:

    cout<<"mousepress at "<<point.x()<<","<<point.y()<<endl;
    return true;
    break;
case QEvent::MouseButtonRelease:
    cout<<"mouserelease at "<<point.x()<<","<<point.y()<<endl;
    return true;
    break;
default:
    //standard event processing
    return QObject::eventFilter(obj, event);
    break;
}
return 0;
}

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Быстрый ответ заключается в том, что QGraphicsView, по-видимому, не позволяет другим объектам QObject съесть свой mouseReleaseEvents. Я пока не уверен, почему, но я думаю, что это связано с тем, как mouseReleaseEvent () переопределяется в QGraphicsView. Небольшой взлом дает обходной путь:

HEADER:

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();
}

Попробуйте закомментировать вызовы 'event-> ignore ()' в переопределенных средствах отслеживания событий мыши, и станет понятно, что mouseReleaseEvent () в QGraphicsView может работать неправильно ...

Если вы можете переопределить QGraphicsView как очень тонкий класс только с помощью конструктора и mouseReleaseEvent () {event-> ignore ()}, тогда вы сможете обойти эту ошибку (хотя, хотя этот хак кажется стабильным - предполагая, что ваша проблема может быть ошибкой в ​​QGraphicsView, без тщательного изучения источника QGraphicsView, мы не можем быть уверены, что это на самом деле не предназначенная функция, и, следовательно, этот хак ничего не сломит!)

-Sam

0 голосов
/ 11 октября 2011

Используйте QGraphicsSceneMouseEvent и т.п. вместо QMouseEvent.Как я выяснил в моем вопросе , QGraphicsScene не отправляет обычные события мыши.

С наилучшими пожеланиями

...