Qt - передавать события нескольким объектам? - PullRequest
2 голосов
/ 31 августа 2009

У меня в основном есть 3 слоя (Window > Scene > View), каждый из которых должен обрабатывать событие mouseMove, не блокируя остальные. Кажется, только младший ребенок получает событие, хотя. Я надеялся, что смогу обработать событие и затем вызвать event->ignore(), чтобы передать событие обратно в стек, но, похоже, оно не работает.

Какой-нибудь соответствующий код, если он вам нужен:

void EditorWindow::createScene() {
    m_scene = new EditorScene(this);
    m_view = new EditorView(m_scene);
    // ...
}

void EditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) {
    printf("B\n");
    // ...
}

void EditorView::mouseMoveEvent(QMouseEvent* event) {
    printf("C\n");
    event->ignore();
}

Только "C" печатается. Обратите внимание, что EditorScene и EditorView получают различные типы событий мыши, поэтому не совсем легко их передавать.

EditorWindow также нужны координаты мыши; в настоящее время я посылаю сигнал от одного из детей, который попадает в окно ... но на самом деле не должно быть необходимости передавать его таким образом, не так ли?


Нашел это Хорошая статья . Вызов ignore() говорит Qt найти другого получателя. Похоже, это должно работать, но, возможно, это означает несвязанный приемник. Правильный способ распространения - это вызвать BaseClass::Event примерно так:

void EditorView::mouseMoveEvent(QMouseEvent* event) {
    QGraphicsView::mouseMoveEvent(event); // propogate to parent widget
    printf("C\n");   
}

Теперь он печатает BCBCBC ... это здорово, но я не могу подтолкнуть его еще на один уровень ...


Другое редактирование: было правильно распространено, просто у меня не было включено setMouseTracking.

Ответы [ 2 ]

3 голосов
/ 31 августа 2009
QGraphicsView::mouseMoveEvent(event);

Не распространяется до родителя - фактически распространяется до сцены.

Вот что происходит - QGraphicsView получает QMouseEvent, переводит его в QGraphicsSceneMouseEvent и передает его на сцену. Затем сцена передает его соответствующему элементу или, в вашем случае, печатает «B». Затем обработчик события возвращается в EditorView и печатает «C».

Тогда, если вы явно проигнорируете событие (по умолчанию движение мыши принято), обработчик события Qt передаст событие родительскому объекту EditorView. Поэтому попробуйте игнорировать после того, как вы напечатаете "C".

Еще одна вещь, связанная с перемещением мыши, такова:

Если отслеживание мыши отключено, события перемещения мыши происходят только при нажатии кнопки мыши во время перемещения мыши. Если отслеживание мыши включено, события перемещения мыши происходят, даже если не нажата ни одна кнопка мыши.

Поэтому убедитесь, что у вас включено отслеживание на родительском объекте EditorView (или что вы нажимаете кнопки:)).

EDIT: Кстати, EditorScene не является родителем EditorView. Ну, это в вашем коде, но только в QObject, значении родства (только управление памятью).

QGraphicsScene и View не имеют нормальных семейных отношений - у сцены может быть несколько представлений, и эти представления являются детьми не связанных между собой родителей.

Для целей распространения события окна у вас должен быть родитель на основе QWidget. На самом деле я уверен, что вы переопределяете EditorView в EditorWindow или одного из его дочерних элементов (когда вы добавляете его в макет).

INSTAEDIT: Для координат вы хотите, чтобы View сам излучал сигнал. И по причинам разделения, и потому что вы, вероятно, хотите показать локальные координаты вида, а не родительского окна и не экранные координаты (верно?). Если вам действительно нужны координаты сцены, то View также является правильным выбором, потому что он знает матрицу преобразования.

Координаты идут так: Экран -> EditorWindow локальный -> EditorView локальный -> Scene преобразуется -> любой элемент локально преобразован.

2 голосов
/ 11 сентября 2009

QGraphicsView :: mousePressEvent (e) в моем mousePressEvent добились цели!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...