Событие двойного щелчка QGraphicPixmapItem не переходит к родительскому виджету, пока QGraphicsTextItem отправляет

У меня есть основной виджет в Qt, и этот виджет содержит QGraphicsView, а внутри него QGraphicsScene. В сцене я добавляю QGraphicsPixmapItems и QGraphicsTextItems. В основном виджете я обрабатываю QWidget::mouseDoubleClickEvent ( QMouseEvent * event ), все мои элементы имеют установленные флаги:

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

Поскольку я хочу перемещать элементы в сцене и выбирать их, а также хочу, чтобы при двойном щелчке главный виджет обрабатывал это. Когда я дважды щелкаю по QGraphicsTextItem, он переходит к mouseDoubleClickEvent в основном виджете, однако, когда я дважды щелкаю по элементу QGraphicsPixmap, он поглощает двойной щелчок и не отправляет его в основной виджет. Также, когда флаг ItemIsFocusable не установлен, QGraphicsTextItem также поглощает событие двойного щелчка. Почему это происходит?.
Я не хотел реализовывать подкласс QGraphicsItems и хотел использовать уже определенные методы. Вот фото того, что я делаю:

введите здесь описание изображения


person Akın Yılmaz    schedule 03.03.2016    source источник
comment
Текстовое описание того, что, по вашему мнению, делает ваш код, может сильно отличаться от того, что он делает на самом деле. Я предлагаю опубликовать пример вашего кода, чтобы улучшить вопрос.   -  person TheDarkKnight    schedule 03.03.2016
comment
Что вы ожидаете от QGraphicsPixmapItem при двойном щелчке? Элементы выполняют свою реализацию по умолчанию: если вы не подклассируете их и не сделаете свою собственную реализацию.   -  person Thalia    schedule 04.03.2016


Ответы (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;
}

Теперь я могу обнаруживать двойные щелчки по QGraphicsItems на сцене моего основного виджета.

person Akın Yılmaz    schedule 04.03.2016