如何仅执行 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 的子类仅从边界矩形接收边框上的悬停事件
QGraphicsView:如何高效获取QGraphicsItems的视口坐标?