Как мне распространить mousePressEvent () на группу QGraphicsItems? - PullRequest
2 голосов
/ 02 марта 2012

Я пишу программу, которая использует каркас Qt Graphics View. Я подкласс QGraphicsItem к классу, который включает в себя другие QGraphicsItem (или другие его подклассы). Этот класс является родителем включенного QGraphicsItem; Идея состоит в том, чтобы работать с составными объектами.

Из документов , похоже, конфликт в том, чего я пытаюсь достичь:

  • Вызов ignore() в mousePressEvent сделает мой объект неподвижным. Я хочу переместить это.
  • Вызов accept() в mousePressEvent предотвратит распространение события на дочерний объект. Некоторые дочерние объекты должны реагировать на события мыши.

Как я могу сделать эту работу?

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Я думаю, что ваша интерпретация документации неверна.

Вызов ignore() в mousePressEvent сделает мой объект неподвижным.

Я не верюэто правда.Мне кажется, что вызов ignore() подобен объекту, говорящему: «Я оценил это событие. Я предпринял все действия, которые хочу сделать в ответ на это событие. Я также решил, что это не было предназначено для меня, поэтому я буду сейчаспередать его следующему объекту подо мной ".Я не могу найти ничего, что бы указывало на то, что событие ignore сбросит флаг QGraphicsItem::ItemIsMovable (который решает, является ли объект QGraphicsItem подвижным или нет).

Я не понимаю, почему вы не смогли сделатьобъект перемещается и ignore() событие, но я бы советовал, что это не разумный подход (в большинстве случаев: очевидно, у вас может быть причина для этого).

Вызовaccept() в mousePressEvent предотвратит распространение события на дочерний объект.

Я верю, что это правда, но родитель все еще может изменить своих потомков.Насколько я понимаю, вызов accept() подобен объекту, говорящему: «Я оценил это событие. Я предпринял все действия, которые хочу выполнить в ответ на это событие (которое может включать изменение моих детей). Я также решил, что это событие было предназначенодля меня, поэтому я не буду проходить событие ".

0 голосов
/ 24 апреля 2016

Отправка QCoreApplication::postEvent(child, mouseEvent) дочерним объектам.

0 голосов
/ 02 марта 2012

В родительском QGraphicsItem вы можете попытаться

MyObject::mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
    QGraphicsItem::mousePressEvent(event);
    event->ignore();
}

Это позволит нормальной обработке события мыши (т.е. сделает ваш объект подвижным), но затем игнорирует его, чтобы он распространялся.*

Однако логика должна быть более надежной, поскольку существует высокий риск побочных эффектов, если родитель и ребенок отвечают на одно и то же событие мыши.

...