Russian Qt Forum
Сентябрь 28, 2024, 18:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО]  (Прочитано 8904 раз)
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? Или мой подход в корне неправильный? Спасибо.
« Последнее редактирование: Февраль 22, 2010, 14:21 от JayFOX » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 22, 2010, 13:59 »

а ты попробуй использовать предыдущие координаты, а то ты только текущие используешь.
QGraphicsSceneMouseEvent::lastScenePos()

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

Юра.
JayFOX
Гость
« Ответ #2 : Февраль 22, 2010, 14:03 »

Не помогло.
Записан
ufna
Гость
« Ответ #3 : Февраль 22, 2010, 14:11 »

ну вообще я бы сказал что подход не правильный, если нужна н/п линия. По сути, ты должен соединять точку предыдущую и текущую линией, нарисованной за счет "дубляжа" этих эллипсов с минимально зримой частотой, что сводится к другой проблеме - как правильно быстро отрисовать такую линию между этими двумя точками, ведь по сути "дублировать" ничего не надо.
Записан
JayFOX
Гость
« Ответ #4 : Февраль 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);
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Февраль 22, 2010, 22:37 »

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

Сталкивался ли кто-нибудь??? Особенно проблема 2 интересует!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 22, 2010, 23:27 »

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

Анализ результатов. Проблем с задержками/залипанием нет (делалось еще на G4 733 Mhz). Но масса проблем с "рукой", особенно когда движение медленное (дрожание, прыжки и.т.п). То, что нужна пост-обработка, фильтры и.т.п. - это точно. Ручной ввод надо рассматривать как создание "сырых" базовых/исходных данных, которые потом надо парить в редакторе - тогда все на своем месте.
Записан
SABROG
Гость
« Ответ #7 : Февраль 22, 2010, 23:40 »

Построение Кривой-Безье по нескольким точкам могло бы дать плавные линии.

« Последнее редактирование: Февраль 22, 2010, 23:45 от SABROG » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 22.