当 QGraphicsTextItem 发送时,QGraphicPixmapItem 双击事件不会转到父小部件
QGraphicPixmapItem double click event does not go to parent widget while QGraphicsTextItem send
我在 Qt 中有一个主要的小部件,这个小部件包含一个 QGraphicsView
和里面的 QGraphicsScene
。在场景中,我添加了 QGraphicsPixmapItem
s 和 QGraphicsTextItem
s。在我处理 QWidget::mouseDoubleClickEvent ( QMouseEvent * event )
的主要小部件中,我的项目都设置了标志:
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
因为我想移动场景中的项目和 select 它们,而且我还想在双击发生时由主小部件处理。当我双击 QGraphicsTextItem
时,它会进入主窗口小部件中的 mouseDoubleClickEvent
,但是当我双击 QGraphicsPixmap
项目时,它吸收双击并且不会将其发送到主窗口小部件。此外,当未设置 ItemIsFocusable
标志时,QGraphicsTextItem
也会吸收双击事件。为什么会发生?
我不想实现 QGraphicsItem
的子类,而是想使用已经定义的方法。这是我所做的图片:
我找到了一个解决方案,因为我的 QGraphicsPixmapItem
和 QGraphicsTextItem
在双击时的行为不同: QGraphicsTextItem
将其双击事件发送给父级,而 QGraphicsPixmapItem
不, 我注释掉了 ItemIsFocusable
属性 :
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
//mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
因为即使 ItemIsFocusable
是 QGraphicsItem
属性,它在不同 QGraphicsItem
继承的 类 中的行为也不相同,
因此,为了处理双击,我在 QGraphicsScene
上安装了一个事件过滤器,它在主小部件中包含 QGraphicsItem
s。
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
。
我在 Qt 中有一个主要的小部件,这个小部件包含一个 QGraphicsView
和里面的 QGraphicsScene
。在场景中,我添加了 QGraphicsPixmapItem
s 和 QGraphicsTextItem
s。在我处理 QWidget::mouseDoubleClickEvent ( QMouseEvent * event )
的主要小部件中,我的项目都设置了标志:
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
因为我想移动场景中的项目和 select 它们,而且我还想在双击发生时由主小部件处理。当我双击 QGraphicsTextItem
时,它会进入主窗口小部件中的 mouseDoubleClickEvent
,但是当我双击 QGraphicsPixmap
项目时,它吸收双击并且不会将其发送到主窗口小部件。此外,当未设置 ItemIsFocusable
标志时,QGraphicsTextItem
也会吸收双击事件。为什么会发生?
我不想实现 QGraphicsItem
的子类,而是想使用已经定义的方法。这是我所做的图片:
我找到了一个解决方案,因为我的 QGraphicsPixmapItem
和 QGraphicsTextItem
在双击时的行为不同: QGraphicsTextItem
将其双击事件发送给父级,而 QGraphicsPixmapItem
不, 我注释掉了 ItemIsFocusable
属性 :
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
//mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
因为即使 ItemIsFocusable
是 QGraphicsItem
属性,它在不同 QGraphicsItem
继承的 类 中的行为也不相同,
因此,为了处理双击,我在 QGraphicsScene
上安装了一个事件过滤器,它在主小部件中包含 QGraphicsItem
s。
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
。