Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: JayFOX от Февраль 22, 2010, 13:43



Название: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО]
Отправлено: JayFOX от Февраль 22, 2010, 13:43
Здравствуйте. Надо рисовать кистью как во всех графических редакторах. Решил сделать так
Код:
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
        QGraphicsEllipseItem*e = new QGraphicsEllipseItem(event->scenePos().x(),event->scenePos().y(),20,20,0,this);
        e->setBrush(QBrush(Qt::green));
        e->setPen(Qt::NoPen);
}
Но беда в том, что если мышкой чуть сильнее дернуть - кружки перестают быть непрерывной линией. Напрашивается вопрос - можно ли увеличить частоту события mouseMoveEvent? Или мой подход в корне неправильный? Спасибо.


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)
Отправлено: lit-uriy от Февраль 22, 2010, 13:59
а ты попробуй использовать предыдущие координаты, а то ты только текущие используешь.
QGraphicsSceneMouseEvent::lastScenePos()

Цитировать
кружки перестают быть непрерывной линией
Может стоит рисовать сразу линией?


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)
Отправлено: JayFOX от Февраль 22, 2010, 14:03
Не помогло.


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)
Отправлено: ufna от Февраль 22, 2010, 14:11
ну вообще я бы сказал что подход не правильный, если нужна н/п линия. По сути, ты должен соединять точку предыдущую и текущую линией, нарисованной за счет "дубляжа" этих эллипсов с минимально зримой частотой, что сводится к другой проблеме - как правильно быстро отрисовать такую линию между этими двумя точками, ведь по сути "дублировать" ничего не надо.


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)
Отправлено: JayFOX от Февраль 22, 2010, 14:20
Спасибо! Идеально!
Код:
QGraphicsLineItem*l = new QGraphicsLineItem(event->lastScenePos().x(),event->lastScenePos().y(),event->scenePos().x(),event->scenePos().y(),0,this);
        QPen p;
        p.setBrush(QBrush(currentColor));
        p.setWidth(20);
        p.setCapStyle(Qt::RoundCap);
        l->setPen(p);


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО]
Отправлено: break от Февраль 22, 2010, 22:37
Сори что не совсем по теме - а вот проблема НЕЧАСТЫХ событий от мыши действительно существует - у меня есть OpenGL приложение где потребовалось сделать управление камерой через мышь - сначало оно было на клавиатуре W,A,S,D(движение) и клавиши курсора(направление взгляда). Захотелось сдублировать управление камерой на мышь
1) проблема - отсутствие относительного перемещения мышки - и это действительно не гуд т.к. старые координаты не удобно использовать при круговой вращении без остановки - курсор упирается в край экрана и все - пришлось отдельно обрабатывать, перемещать на другуб противоположную половину курсор и т.д. Гораздо проще и удобнее было бы получать от мыши относительное перемещение...
2) проблема - как только все реализовал вроде заработало - но при движении жуткие тормоза когда мышкой вертишшь камеру, если стоять на месте то тормозов нет. Стал копать - выяснил, что при периодической генерации событий от клавиатуры (клавиша зажата и удерживается) - от мыши события приходят в 2 а то и в 3 раза медленнее - это вообще не гуд - косяк прям какой-то. Пользоваться сторонними библиотеками для захвата клавы и мышки сожно - но не хочется с учетом наличия MouseEvent и Keypressed/ReleasedEvent в QWidget

Сталкивался ли кто-нибудь??? Особенно проблема 2 интересует!


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО]
Отправлено: Igors от Февраль 22, 2010, 23:27
JayFOX, приммите мои извинения за оффтоп
Сталкивался ли кто-нибудь??? Особенно проблема 2 интересует!
Я делал такой плагин: показываю окно, в нем кнопка "Record". Пользователь выбирает одно из др. окон, выбирает примитив - запись началась, "Record" мигает. Не отпуская кнопку мыши, пользователь тянет примитив куда надо, обратно и.т.п. Все это время я снимаю время и координаты мыша, перевожу их в 3D координаты (в зависимости от окна где происходит драг). Как только  пользователь отпустил кнопку мыша - все, запись закончилась, можно ее сохранить и/или начать по новой. Результат интерполируется и записывается по кадрам (обычно 25/30 кадров в секунду).

Анализ результатов. Проблем с задержками/залипанием нет (делалось еще на G4 733 Mhz). Но масса проблем с "рукой", особенно когда движение медленное (дрожание, прыжки и.т.п). То, что нужна пост-обработка, фильтры и.т.п. - это точно. Ручной ввод надо рассматривать как создание "сырых" базовых/исходных данных, которые потом надо парить в редакторе - тогда все на своем месте.


Название: Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО]
Отправлено: SABROG от Февраль 22, 2010, 23:40
Построение Кривой-Безье (http://www.antigrain.com/research/bezier_interpolation/index.html) по нескольким точкам могло бы дать плавные линии.

(http://www.antigrain.com/research/bezier_interpolation/spline_polygon1.gif)(http://www.antigrain.com/research/bezier_interpolation/spline_polygon2.gif)