2015-04-21 33 views
1

後,我的派生類從QQuickPaintedItem中,我要處理的mousePressEventmouseReleasEvent(以及mouseMoveEvent但現在不是我prolem)。QQuickPaintedItem mouseReleaseEvent被稱爲唯一的DoubleClick

每次按下鼠標左鍵時都會正確調用mousePressEvent。但mouseReleaseEvent只能在雙擊後才能調用。我期望的是每次釋放按鈕時都能獲得該事件。我該如何改變這一點?

這是我做的:

MyView::MyView(QQuickItem *parent): 
    QQuickPaintedItem(parent) 
{ 
    setAcceptedMouseButtons(Qt::LeftButton); 
} 

void MyView::mousePressEvent(QMouseEvent *evt) 
{ 
    //gets called after every single mouse click 
    qDebug("mousePressEvent"); 
    if(evt->button() == Qt::LeftButton) 
    { 
     //do something... 
     evt->accept(); 
    } 
    else 
    { 
     evt->ignore(); 
    } 
    QQuickPaintedItem::mousePressEvent(evt); 
} 

void MyView::mouseReleaseEvent(QMouseEvent *evt) 
{ 
    //gets only called when releasing the mouse button after a double click 
    qDebug("mouseReleaseEvent"); 
    if(evt->button() == Qt::LeftButton) 
    { 
     //do something... 
     evt->accept(); 
    } 
    else 
    { 
     evt->ignore(); 
    } 
    QQuickPaintedItem::mouseReleaseEvent(evt); 
} 

回答

0

所以,我終於找到了解決辦法!

調用基類的實現是個壞主意,因爲基類只是在事件上調用ignore()。這是基礎類實現:

void QWindow::mousePressEvent(QMouseEvent *ev) 
    { 
     ev->ignore(); 
    } 
    void QWindow::mouseReleaseEvent(QMouseEvent *ev) 
    { 
     ev->ignore(); 
    } 

因此,這是它如何工作的:

MyView::MyView(QQuickItem *parent): 
     QQuickPaintedItem(parent) 
    { 
     setAcceptedMouseButtons(Qt::LeftButton); 
    } 

    void MyView::mousePressEvent(QMouseEvent *evt) 
    { 
     //gets called after every single mouse click 
     qDebug("mousePressEvent"); 
     if(evt->button() == Qt::LeftButton) 
     { 
      //do something... 
      evt->accept(); 
     } 
     else 
     { 
      evt->ignore(); 
     } 
     //DON'T DO THIS: 
     //QQuickPaintedItem::mousePressEvent(evt); 
    } 

    void MyView::mouseReleaseEvent(QMouseEvent *evt) 
    { 
     //now gets called with every mouse release since we don't call the base class any more 
     qDebug("mouseReleaseEvent"); 
     if(evt->button() == Qt::LeftButton) 
     { 
      //do something... 
      evt->accept(); 
     } 
     else 
     { 
      evt->ignore(); 
     } 
     //DON'T DO THIS: 
     //QQuickPaintedItem::mouseReleaseEvent(evt); 
    } 
+0

完美,謝謝!文檔是否明確表示不要在某處執行此操作?爲了完整性,我通常總是調用基類實現。 – Andrew

+0

不,不幸的不是。我也總是調用基礎實現。除非你真的知道你爲什麼要忽略它,否則通常應該這樣做。但這意味着你也知道你的基類會發生什麼。我認爲這是不好的風格。 但通常我也會在覆蓋的方法之上執行此操作。而現在,當我再次看到它時,我不記得爲什麼我把它放在最後。最重要的是它不應該受到傷害(但我不知道在忽略調用中發生了什麼「魔術」)。我不再和Qt一起工作,所以我可能會在家裏檢查。 – Andi