2013-06-23 42 views
0

我知道如何將事件從qgraphicsview傳遞給qgraphicsitem。 但問題是在執行mouseEvent項後,我必須執行視圖的鼠標事件,這在我的情況下是不可取的。 所以,問題是:「是否有一種智能的方法來確定mousePress是在物品上還是在空的空間上?」如何僅執行qgraphicsitem的mouseevent? (忽略qgraphicsview的其餘mouseevent)

編輯:工作代碼:

#include <QtGui> 

class CustomView : public QGraphicsView 
{ 

protected: 
    void mousePressEvent(QMouseEvent *event) 
    { 
     QGraphicsView::mousePressEvent(event); 
     qDebug() << "Custom view clicked."; 

    } 
}; 

class CustomItem : public QGraphicsRectItem 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << "Custom item clicked."; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    CustomItem item; 
    item.setRect(20, 20, 60, 60); 

    QGraphicsScene scene(0, 0, 100, 100); 
    scene.addItem(&item); 

    CustomView view; 
    view.setScene(&scene); 
    view.show(); 
    return a.exec(); 
} 

底肥在qgraphics場景,而不是觀點

#include <QtGui> 
class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     if(itemAt(event->scenePos())) 
      QGraphicsScene::mousePressEvent((event)); 
     else 
     qDebug() << "Custom view clicked."; 
    } 
}; 
class CustomItem : public QGraphicsRectItem 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << "Custom item clicked."; 
    } 
}; 
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    CustomItem item; 
    item.setRect(20, 20, 60, 60); 
    CustomScene scene; 
    //scene().set 
    scene.addItem(&item); 
    QGraphicsView view; 
    view.setScene(&scene); 
    view.show(); 
    return a.exec(); 
} 

回答

2

要確定閹鼠標事件發生於項目或沒有,你可以使用QGraphicsView::itemAt相同的概念:

void CustomView::mousePressEvent(QMouseEvent *event) 
{ 
    if (itemAt(event->pos())) 
     // Click on item 
    else 
     // Click on empty space 
    ... 
} 
+0

謝謝你:)它的工作原理! – Radwa

+0

嘿,跟進問題,如果我可以...當我執行itemAt(event-> pos())我得到QGraphicsItem(0)。我怎樣才能「知道」這是QGraphicsView的視口?試圖確定何時點擊這裏的空白空間。 – Dariusz

3

有3種正確的方法可以解決您的任務:

1.重新實現QGraphicsView::mousePressEvent並使用QGraphicsView::itemAt找到點擊的項目。

2.子類QGraphicsScene和重新實現QGraphicsScene::mousePressEvent。其參數event包含場景座標中的位置,您可以使用QGraphicsScene::itemAt來確定哪個項目已被點擊。 (或任何派生類)和重新實現QGraphicsItem::mousePressEvent。只有在單擊此元素時纔會調用它。

+0

感謝您的回覆,但是當我用qgraphicsScene嘗試它時,它無法工作。我無法弄清楚問題所在。 – Radwa