QGraphicsScene не отвечает на синтетические события - PullRequest
1 голос
/ 22 февраля 2011

У меня есть очень простой собственный класс, полученный из QGraphicsScene:

class SceneComponent : public QGraphicsScene
{
    Q_OBJECT
public:
    explicit SceneComponent(QObject* parent = 0);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent*);
};

И mousePressEvent(QGraphicsSceneMouseEvent*) определяется как:

void SceneComponent::mousePressEvent(QGraphicsSceneMouseEvent* event) {
    Q_UNUSED(event);
    std::cout<<"[Processing] MouseEvent"<<std::endl;
}

Для отображения этого QGraphicsView это так простокак:

QGraphicsView view(sceneComp);
view.show();

Теперь, когда я нажимаю на окно (для QGraphicsView), которое отображается, я получаю следующий вывод:

[Processing] MouseEvent
[Processing] MouseEvent

Однако, когда я отправляю синтетическийиспользование события:

QMouseEvent* mevent = new QMouseEvent(
            QMouseEvent::MouseButtonPress, QPoint(50, 50),
            Qt::LeftButton, Qt::NoButton, Qt::NoModifier
);
QApplication::sendEvent(&view, mevent);

Я не получаю абсолютно никакого вывода.Почему это так?

В соответствующей заметке установка eventFilter на QGraphicsScene не дает никаких результатов.Вероятно, это (по моему мнению) из-за того факта, что QGraphicsScene ожидает QGraphicsSceneMouseEvent вместо QMouseEvent .Это поднимает два вопроса:

  1. Почему QGraphicsScene не принимает стандартный QEvent и только QGraphicsSceneEvent?
  2. Почему любой производный класс QGraphicsSceneEvent не может быть создан?
  3. Почему я могу отправлять события в QGraphicsScene, используя метод sceneEvent, но мне нужно указать конкретный QGraphicsItem для отправки события?

1 Ответ

2 голосов
/ 22 февраля 2011

Из документов на QGraphicsSceneEvent:

Когда QGraphicsView получает Qt мышь, клавиатура и перетаскивание события (QMouseEvent, QKeyEvent, QDragEvent и т. Д.), Переводит их в экземпляры QGraphicsSceneEvent подклассы и направляет их к QGraphicsScene это отображает. Сцена затем направляет события в соответствующие предметы.

Например, когда QGraphicsView получает QMouseEvent типа MousePress как ответ пользователю нажмите, представление отправляет QGraphicsSceneMouseEvent типа GraphicsSceneMouseПресс в лежащий в основе QGraphicsScene через его Функция mousePressEvent (). дефолт QGraphicsScene :: mousePressEvent () реализация определяет, какой элемент щелкнул и направил событие на QGraphicsItem :: mousePressEvent ().

  1. QGraphicsView использует виджет области просмотра для отображения содержимого сцены и получения пользовательских событий. Попробуйте отправить событие на виджет QGraphicsView::viewport() - оно должно работать.
  2. По замыслу - см. Цитату, эти события, вероятно, не предназначены для отправки вручную. QMouseEvent связан с физическим действием - напр. щелчок мыши, в то время как QGraphicsSceneMouseEvent является чем-то абстрактным ...
  3. Вопрос неясен, но эта цитата также может быть полезной. О каком конкретно событии вы говорите? Также следует помнить, что QGraphicsScene имеет события уровня QObject, отправленные с QApplication::sendEvent(), и события QGraphicsItem, отправленные с QGraphicsScene::sendEvent(). Эти два вида работают в разных плоскостях и имеют разные цели. Обратитесь к документации для получения дополнительной информации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...