2011-10-11 20 views
2

我想通過事件過濾器來獲取mousepress和mouserelease事件的場景座標。 它適用於mousepress,但mouserelease似乎沒有註冊。QGraphicsview mouserelease event does not register

缺少什麼我在這裏?

請注意我用的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; 
} 

回答

1

簡單的回答是的QGraphicsView似乎並沒有讓其他的QObject食其mouseReleaseEvents。我不確定爲什麼只是,但我認爲這是與如何在QGraphicsView中重新實現mouseReleaseEvent()有關。一個小黑客提供了一個解決辦法,但:

部首:

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

嘗試註釋掉 '事件 - >忽略()' 中重新實現的鼠標事件捕電話和它變得清晰QGraphicsView中的mouseReleaseEvent()如何可能出錯...

如果你可以重新實現QGraphicsView作爲一個非常薄的類,只有構造函數nd mouseReleaseEvent(){event-> ignore()}那麼你應該能夠解決這個bug(儘管這個hack看起來很穩定 - 暗示你的問題可能是QGraphicsView中的一個錯誤,而沒有詳盡地查看QGraphicsView源,我們不能肯定這是不是其實是一個預期的功能,因此,這種黑客不會打破任何東西倒行!)

薩姆

+0

這似乎已經完成了這項工作,非常感謝! – Gurba

0

使用QGraphicsSceneMouseEvent和喜歡,而不是QMouseEvent。正如我在my question中發現的,QGraphicsScene不派遣正常的鼠標事件。

致以問候

+0

不幸的是,如果我在場景中安裝事件過濾器並將事件更改爲QGrapicsSceneMouseEvent,我似乎無法獲得任何有用的座標。無論我點擊的位置是什麼,座標總是一樣的。 – Gurba

+0

QEvent是否讓QGraphicsSceneMouseEvent投射成功?你得到了什麼樣的座標? – Gerstmann

+0

你必須使用setSceneRect來匹配視圖,因爲它默認爲qreal事物(-1 - > +1我認爲)在兩個軸上,這可能會讓人困惑。如果你需要這樣的東西,那麼你應該已經知道你需要做適當的轉換,但那是另一個蠟球...... – osirisgothra