LINUX.ORG.RU

одновременная обработка мыши в QGraphicsItem и QGraphicsView


0

1

здрасьте, у меня есть три наследника view, scene и item. когда я во view.h переопределяю mousemoveevent(), то теряется способность перемещать items, и наоборот, когда во items.h переопределяю mousemoveevent(), view не реагирует на мышку.

как сделать, чтобы было одновременно? может флаг какой-нибудь выставить в QgraphicsItem?


зачем одновременно???

Что заставляет выполнять обработку событий мыши _одновременно_ в виде и в айтеме? Как айтем должен реагировать на мышь - почему?

braboar ★★
()
Ответ на: зачем одновременно??? от braboar

дело в том, что первый слой рисуется QPainter-ом - это координатная сетка и много графических примитивов(point), которые с помошью QGraphics framework рисовать не целесообразно. для масштабирования и перемещения системы координат нужна поддержка мышки.

а второй слой - это custom item-ы , которые отображаются поверх 1-го слоя и они тоже должны реагировать на мышку - перетаскивание, выделение.

bejevy
() автор топика
Ответ на: комментарий от bejevy

Последней командой в mouseMoveEvent делаешь

Parent::mouseMoveEvent(QMouseEvent *pme);
Ну не дословно, конечно, но идея ясна, я думаю...

upd: Если я правильно понимаю задачу, тебе надо из item'a дергать обработчик мыши у view.

solovey ★★
()
Последнее исправление: solovey (всего исправлений: 1)
Ответ на: комментарий от bejevy

Т.к. mousemoveevent() - виртуальный метод, то при реализации его в дочернем классе другая реализация из родительского класса вызываться больше не будет, для объектов класса MyGraphicsView её заменит новая.

Т.е. надо из mousemoveevent() в сабклассе QGaphicsView вызвать QGraphicsView::mousemoveevent() во всех случаях, когда требуется дефолтное поведение.

quiet_readonly ★★★★
()
Ответ на: комментарий от solovey

upd: Если я правильно понимаю задачу, тебе надо из item'a дергать обработчик мыши у view.

Да вроде нет, раз ему надо вернуть дефолтную обработку, то дёргать надо реализацию из родительского класса:

void MyGraphicsView::mouseMoveEvent(QMouseEvent *pme)
{
    if (/*требуется какое-то особое действие, конфликтующее с дефолтом*/) {
        doSpecificAction();
    } else {
        if (/*требуется какое-то действие, но дефолтный обработчик тоже нужен*/)
            logEvent();
        QGraphicsView::mouseMoveEvent(pme);
    }
}

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

ок спасибо большое - разобрался

bejevy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.