Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: OS2 от Апрель 22, 2009, 16:39



Название: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: OS2 от Апрель 22, 2009, 16:39
Всем доброго времени суток!
Столкнулся с такой проблемой: имеется класс Вида, унаследованный от QGraphicsView, на нем рисуется Сцена с N объектами, унаследованными от QGraphicsItem. На Виде есть полосы прокрутки, при нажатии одной из клавиш на клавиатуре(Key_Left.....Key_Down), происходит скролирование Вида, в свою очередь объекты на Сцене тоже получают и по своему обрабатывают эти сообщении. НО мне нужно, чтобы сообщения с клавиатуры(имеется в виду только нажатия на стрелочки) проходили мимо полос прокрутки Вида и попадали дальше, к объектам Сцены, для дальнейшей обработки. Скролингом Вида я хочу управлять, например, только мышкой. Как мне этого добиться? Подскажите, плиз....


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: Пантер от Апрель 22, 2009, 16:51
installEventFilter?


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: OS2 от Апрель 22, 2009, 16:54
А по подробней, если можно?


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: BaltikS от Апрель 22, 2009, 18:08
QGraphicsView -> метод installEventFilter и последующая обработка в eventFilter...


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: OS2 от Апрель 22, 2009, 18:52
QGraphicsView -> метод installEventFilter и последующая обработка в eventFilter...
Да это понятно, я знаю как устанавливать фильтр событий, вопрос в другом: как в этом фильтре отловив нужное событие, отправить его объекту(наследнику QGraphicsItem) на Сцене, но не отправлять слайдеру?!


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: BaltikS от Апрель 22, 2009, 20:03
Я например отлавливал события сцены и перемещал элементы (правда не по стрелкам) примерно вот так:
Код:
QList<QGraphicsItem *> list = scene()->selectedItems ();
for (int i =0; i<list.size(); ++i)
    list.at(i)->moveBy(1,1);
Сразу оговорюсь, я намеренно не обрабатывал события клавиатуры у Итема, так как фокус имеет лишь только один итем.

А по-поводу eventFilter - гляди в ассистент, там был пример...


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: OS2 от Апрель 22, 2009, 20:09
Так я же написал "отловив", а не "отловить", все нужные мне события от клавиатуры я отловил, а вот как поступить дальше:
Цитировать
...отправить его объекту(наследнику QGraphicsItem) на Сцене, но не отправлять слайдеру?!
я не знаю....  ???

ЗЫ: под словом "слайдер" я имею в виду скролл бар(бары).


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: Kolobok от Апрель 23, 2009, 11:13
Послать event можно так:

bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event )   [static]

а что бы оно больше нигде не обрабатывалось, вернуть в методе eventFilter()  правду.


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: OS2 от Апрель 23, 2009, 13:47
По видимому чего-то я понять не могу.....
на сколько я знаю: sendEvent можно вызвать для генерации сообщения объектам, унаследованным от QObject, но в моем случае я пытаюсь послать сообщение(keyPressEvent) объекту унаследованному от QGraphicsItem, а в QGraphicsItem QObjectом и не пахнет.  :o


Название: Re: Перехват сообщений клавиатуры и отправка их напрямую объектам QGraphicsItem
Отправлено: Kolobok от Апрель 24, 2009, 00:39
Ну пошли событие сцене, а в сцене передай айтему.