Событие двойного щелчка QGraphicPixmapItem не переходит в родительский виджет при отправке QGraphicsTextItem
У меня есть основной виджет в Qt, и этот виджет содержит QGraphicsView
и внутри QGraphicsScene
, В сцене я добавляю QGraphicsPixmapItem
с и QGraphicsTextItem
s. В основном виджете я работаю QWidget::mouseDoubleClickEvent ( QMouseEvent * event )
Все мои вещи установлены с флагами:
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
Потому что я хочу перемещать элементы в сцене и выбирать их, а также хочу, чтобы при двойном щелчке основной виджет обрабатывал это. Когда я дважды нажимаю на QGraphicsTextItem
это входит в mouseDoubleClickEvent
в основном виджете, однако, когда я дважды щелкаю QGraphicsPixmap
элемент, он поглощает двойной щелчок и не отправляет его в основной виджет. Также когда ItemIsFocusable
флаг не установлен, QGraphicsTextItem
также поглощает событие двойного щелчка. Почему это происходит?
Я не хотел реализовывать подкласс QGraphicsItem
и хотел использовать уже определенные методы. Вот картина того, что я делаю:
1 ответ
Я нашел решение для этого, потому что мой QGraphicsPixmapItem
а также QGraphicsTextItem
ведет себя по-разному при двойном нажатии: QGraphicsTextItem
отправляет событие двойного щелчка родительскому элементу QGraphicsPixmapItem
нет, я закомментировал ItemIsFocusable
имущество:
mItem->setFlag ( QGraphicsItem::ItemIsMovable );
mItem->setFlag ( QGraphicsItem::ItemIsSelectable );
//mItem->setFlag ( QGraphicsItem::ItemIsFocusable);
Потому что даже если ItemIsFocusable
это QGraphicsItem
свойство, оно не ведет себя одинаково в разных QGraphicsItem
унаследованные классы, поэтому для обработки двойного щелчка я установил фильтр событий на QGraphicsScene
который содержит 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 на сцене моего главного виджета.