2013-06-23 31 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