我知道如何将事件从 qgraphicsview 传递到 qgraphicsitem。但问题是在执行 item 的 mouseEvent 之后,我必须执行 View 的鼠标事件,这在我的情况下是不可取的。所以,问题是:“是否有一种聪明的方法来知道 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 场景而不是 View 中应用相同的概念
#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();
}
有 3 种正确的方法可以解决您的任务:
1.
重新实现 QGraphicsView::mousePressEvent
并使用 QGraphicsView::itemAt
找到点击的项目。
2.
子类 QGraphicsScene
并重新实现 QGraphicsScene::mousePressEvent
。它的参数 event
包含场景坐标中的位置,您可以使用 QGraphicsScene::itemAt
确定哪个项目被点击。
3.
子类 QGraphicsItem
(或任何派生类)并重新实现 QGraphicsItem::mousePressEvent
。仅当单击此元素时才会调用它。
我是一名优秀的程序员,十分优秀!