0

我知道如何将事件从 qgraphicsview 传递到 qgraphicsitem。但问题是在执行 item 的 mouseEvent 之后,我必须执行视图的鼠标事件,这在我的情况下是不可取的。所以,问题是:“有没有一种聪明的方法可以知道 mousePress 是在一个项目上还是在一个空白空间上?”

编辑:工作代码:

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

2 回答 2

3

有 3 种正确的方法可以解决您的任务:

1.重新实现QGraphicsView::mousePressEvent并用于QGraphicsView::itemAt查找单击的项目。

2.子类化QGraphicsScene和重新实现QGraphicsScene::mousePressEvent。它的参数event包含场景坐标中的位置,您可以使用QGraphicsScene::itemAt它来确定单击了哪个项目。

3.子类QGraphicsItem(或任何派生类)并重新实现QGraphicsItem::mousePressEvent。仅当单击此元素时才会调用它。

于 2013-06-23T07:50:21.053 回答
2

要确定是否在 item 上发生了鼠标事件,您可以使用QGraphicsView::itemAt

void CustomView::mousePressEvent(QMouseEvent *event)
{
    if (itemAt(event->pos()))
        // Click on item
    else
        // Click on empty space
    ...
}
于 2013-06-23T06:55:51.157 回答