如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)

Posted

技术标签:

【中文标题】如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)【英文标题】:How to execute the mouseevent of qgraphicsitem only ? (ignoring the rest of mouseevent of qgraphicsview) 【发布时间】:2013-06-23 02:42:46 【问题描述】:

我知道如何将事件从 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();

【问题讨论】:

【参考方案1】:

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

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

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

3. 子类QGraphicsItem(或任何派生类)并重新实现QGraphicsItem::mousePressEvent。只有当这个元素被点击时才会被调用。

【讨论】:

感谢您的回复,但是当我尝试使用 qgraphicsScene 时,它​​不起作用。我无法找出问题所在。【参考方案2】:

要确定项目是否发生鼠标事件,您可以使用QGraphicsView::itemAt:

void CustomView::mousePressEvent(QMouseEvent *event)

    if (itemAt(event->pos()))
        // Click on item
    else
        // Click on empty space
    ...

【讨论】:

嘿,一个后续问题,如果我可以...当我执行 itemAt(event->pos()) 时,我得到 QGraphicsItem(0)。我如何“知道”这是 QGraphicsView 的视口?试图确定我何时单击此处的空白区域。

以上是关于如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem 的子类仅从边界矩形接收边框上的悬停事件

如何知道当前正在移动哪个 QGraphicsItem?

QGraphicsView:如何高效获取QGraphicsItems的视口坐标?

QGraphicsItem:如何在 QGraphicsScene 调整大小时自动移动它?

Qt:如何调整 QGraphicsItem 以动态改变大小

PySide2 中的 QGraphicsItem.itemClipsChildrenToShape 问题