Быстрый ответ заключается в том, что 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