1

我在 Qt 中有一个主小部件,这个小部件在其中包含一个QGraphicsViewQGraphicsScene。在场景中,我添加了QGraphicsPixmapItems 和QGraphicsTextItems。在我处理的主要小部件QWidget::mouseDoubleClickEvent ( QMouseEvent * event )中,我的项目都设置了以下标志:

mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
mItem->setFlag ( QGraphicsItem::ItemIsFocusable);

因为我想在场景中移动项目并选择它们,而且我想在双击发生时主小部件处理它。当我双击QGraphicsTextItem它进入mouseDoubleClickEvent主小部件时,但是当我双击QGraphicsPixmap项目时,它会吸收双击并且不会将其发送到主小部件。此外,当ItemIsFocusable未设置标志时,QGraphicsTextItem也会吸收双击事件。为什么会出现?。
我不想实现QGraphicsItems 的子类并且想使用已经定义的方法。这是我所做的图片:

在此处输入图像描述

4

1 回答 1

2

我找到了一个解决方案,因为我的QGraphicsPixmapItem和双击时的QGraphicsTextItem行为不同:QGraphicsTextItem将其双击事件发送给父级,而QGraphicsPixmapItem没有,我注释掉了该ItemIsFocusable属性:

mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
//mItem->setFlag ( QGraphicsItem::ItemIsFocusable);

因为即使ItemIsFocusable是一个QGraphicsItem属性,它在不同的继承类中的行为也不相同QGraphicsItem,所以为了处理双击,我在主窗口小部件中安装了一个QGraphicsScene包含s 的事件过滤器。QGraphicsItem

this->ui.graphicsViewMainScreen->scene ( )->installEventFilter ( this );

并作为事件过滤器的实现:

bool MyMainWidget::eventFilter ( QObject *target , QEvent *event )
{
    if ( target == this->ui.graphicsViewMainScreen->scene ( ) )
    {
        if ( event->type ( ) == QEvent::GraphicsSceneMouseDoubleClick )
        {
            QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent *>( event );
        }
    }
    return false;
}

QGraphicsItem现在我可以在我的主窗口小部件的场景中检测到对 s 的双击。

于 2016-03-04T07:24:05.707 回答