Qt 我可以在QGraphicsItem中获取鼠标事件吗?

Qt 我可以在QGraphicsItem中获取鼠标事件吗?,qt,qgraphicsview,qgraphicsitem,qmouseevent,Qt,Qgraphicsview,Qgraphicsitem,Qmouseevent,我已经子类化了qgraphicsrecitem,它没有接收任何鼠标事件。我见过其他类似的问题,比如说我需要启用鼠标跟踪,但是setMouseTracking在QWidget中,而QGraphicsItem似乎不是QWidget 我已经实现了绘制,这很有效。在我的子类QGraphicsView中,我得到了鼠标事件 文档似乎认为我应该重写mousePressEvent函数(例如),然后开始获取事件。无论我是否将mousePressEvent转发到QGraphicsView的超类,似乎都没有任何区别。

我已经子类化了
qgraphicsrecitem
,它没有接收任何鼠标事件。我见过其他类似的问题,比如说我需要启用鼠标跟踪,但是
setMouseTracking
在QWidget中,而QGraphicsItem似乎不是QWidget

我已经实现了
绘制
,这很有效。在我的子类QGraphicsView中,我得到了鼠标事件


文档似乎认为我应该重写mousePressEvent函数(例如),然后开始获取事件。无论我是否将mousePressEvent转发到QGraphicsView的超类,似乎都没有任何区别。

在子类QGraphicsView中,如果希望重写鼠标事件方法向下传播到项,则需要调用它们的默认实现。例如:

CustomView::mousePressEvent(QMouseEvent *event)
{
    // handle the event as you like

    QGraphicsView::mousePressEvent(event); // then call default implementation
}
如果要接受悬停事件,需要调用
QGraphicsItem::setAcceptHoverEvents(true)。否则,不需要启用任何特定的鼠标跟踪

编辑:下面是一个完整的工作示例:

#include <QtGui>

class CustomView : public QGraphicsView
{
protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << "Custom view clicked.";
        QGraphicsView::mousePressEvent(event);
    }
};

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();
}
#包括
类CustomView:公共QGraphicsView
{
受保护的:
作废鼠标压力事件(QMouseEvent*事件)
{

qDebug()我遇到了与您相同的问题,我想在Anthony非常好的答案的基础上添加一些见解。下面是我编写的一个示例,展示了可以使用鼠标事件和键盘事件实现的一些功能

请注意,事件不会传播到
QGraphicsItemGroup
QList
中的
QGraphicsItem
(我花了一段时间才弄清楚)

#包括
#包括
#包括
#包括
#包括
类CustomItem:公共QGraphicsSellipseitem
{
受保护的:
无效鼠标压力事件(QGraphicsSceneMouseEvent*事件)
{
如果(事件->按钮()==Qt::LeftButton){
if(事件->修饰符()==Qt::ShiftModifier){
qDebug()修饰符()==Qt::AltModifier){
qDebug()scenePos();
qDebug()pos().y()-dist,dist*2,dist*2);
}else if(事件->修改器()!=Qt::AltModifier){
qDebug()setRect(pt.x()-25,pt.y()-25,50,50);
item->setFlags(QGraphicsItem::ItemIsSelectable|
QGraphicsItem::ItemIsMovable);
增编(项目);
}else if(事件->按钮()==Qt::RightButton){
//检查光标下是否有项目
QGraphicsItem*itemToRemove=NULL;
foreach(自动项目,项目(事件->场景()){
如果(项->类型()==QGraphicsItem::UserType+1){
itemToRemove=项目;
打破
}
}
如果(项目删除){
//从Graphicscene中删除该项
移除项目(项目移除);
}
}
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent*事件)
{
qDebug()key()==Qt::key\u退格){
//删除所有选定项目

qDebug()我遇到了一个类似的问题,视图不接受鼠标单击。问题是我需要启用视图(ui->view->setEnabled(true)).

如问题中所述,我尝试过。我在QGraphicsSitem中的mousepress事件上有一个断点,无论我是否调用它,它都不会被调用
QGraphicsView::MousePresseEvent(事件);
@Almo是否覆盖子类QGraphicscene中的任何鼠标事件?在我的QGraphicsView子类中,我创建了一个QGraphicscene,并用它调用setScene。我没有子类QGraphicscene。@Almo查看编辑的工作示例。我猜您的
QGraphicsSitem::boundingRect()
没有返回正确的rect,或者如果您重新实现了
QGraphicsItem::shape()
,这是不对的。Argh.
qgraphicsceneouseevent
。我一直在寻找
QMouseEvent
作为参数,因为
QGraphicsView
覆盖使用了这些。我没有注意到它们对于
QGraphicsItem
是不同的。你的例子指出了这一点。我感到尴尬。)