2012-03-02 4 views
2

Я пишу программу, которая использует инфраструктуру графического представления Qt. Я подклассифицировал QGraphicsItem классу, который включает в себя другие QGraphicsItem (или другие его подклассы). Этот класс является родителем включенного QGraphicsItem; идея заключается в работе с составными объектами.Как распространять mousePressEvent() в группу QGraphicsItems?

С docs это, кажется, конфликт в том, что я пытаюсь достичь:

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

Как это сделать?

+1

Вы считали, что событие отправлено каждому из детей элемента, если родительский обработчик вызывает QApplication :: postEvent? – kenrogers

+0

Игнорировать мой последний комментарий. Плохая идея. См. Ответ Стайн ниже. – kenrogers

+0

Я сейчас пытаюсь это сделать: Левое нажатие мыши - это начало действия перемещения, поэтому оно принимается в 'mousePressEvent()' и обрабатывается объектом. Ни один другой объект не получит событие. Для другого ввода (правая кнопка, клавиши-модификаторы) событие игнорируется и переходит к следующему объекту. Stynes666 прав насчет того, что есть что-то, что не имеет большого смысла. –

ответ

2

Возможно, ваша интерпретация документации неверна.

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

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

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

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

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

+0

Проблема с перемещением вызвана отсутствием событий перемещения мыши: «Если вы вызываете событие QEvent :: ignore() на событие, этот элемент потеряет захват мыши, а событие будет распространяться на любой самый верхний элемент внизу. будет доставлен в этот пункт, если не будет получено новое событие нажатия мыши ». –

+0

Итак, (если у вас есть все основания отвечать на событие ** и ** говоря, что вы игнорируете его), выполните свой ответ до вызова ignore. –

+0

Будет больше смысла называть accept() (чтобы получить mouseMoveEvents) после уведомления детей, как это было предложено. Я действительно попытался это, вызвав методы mousePressEvent() для детей, но так как они являются защищенными членами. Я уверен, что могу найти способ обхода, но выглядит уродливо. Основная мотивация моего вопроса заключалась в том, чтобы получить лучшее предложение. –

0

В родителе QGraphicsItem, вы могли бы попытаться

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

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

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

+0

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

0

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

Смежные вопросы