Qt, Пропуск мыши, не обновляет каждый пиксель, mouseMoveEvent () - PullRequest
4 голосов
/ 03 августа 2009

Я работаю над простой программой рисования. Казалось, Qt (и KDE) будет простым способом реализовать это. Я считаю, что с Qt довольно легко работать, но теперь я столкнулся с проблемой.

Когда я рисую что-то в моей программе, мышь пропускает, если я перемещаю мышь быстро.

как это:
alt text
Он был похож на одну длинную нить.

Я использую mouseMoveEvent (), чтобы нарисовать пиксель на моем изображении при нажатии левой кнопки мыши. Я назвал setMouseTracking (true); поэтому событие должно вызываться, пока я перемещаю мышь.

void camoMaker::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->state()==Qt::LeftButton)
    {
        QPoint mPoint=ev->pos();
        mPoint.setX(mPoint.x()-80);
        drawPoint(mPoint);
    }
}

CamoMaker является основным виджетом.
drawPoint () рисует пиксель как на внутреннем QImage, так и используя QPainter на QWidget, который является областью рисования.

Мне кажется, что либо mouseMoveEvent () не вызывается для каждого пикселя, который перемещает мышь, или что мышь фактически пропускает какой-то пиксель.

Я понимаю, что это может быть просто из-за того, как это работает, а не из-за Qt, а из-за X11 или из-за того, как ОС обрабатывает положение / ввод мыши.

Если да, то как мне исправить это, должен ли я попытаться интерполировать из двух зарегистрированных точек?

Ответы [ 2 ]

13 голосов
/ 03 августа 2009

События мыши не происходят для каждого пикселя при движении мыши в большинстве операционных систем. Обработчики сообщений (включая KDE / linux) постоянно показывают движения мыши, но пиксели часто пропускаются.

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

3 голосов
/ 03 августа 2009

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

...