Проблема с отрисовкой линии в зависимости от положения мыши

У меня есть виджет openGL, в котором я хочу отобразить строку, зависящую от положения мыши, следующим образом:

        glPushMatrix();
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glColor4f(1, 0, 0, 0.1);
        glScalef(a, b, 0);
        glBegin(GL_LINES);
        glVertex2f(pushedX, pushedY);
        glVertex2f(currentX, currentY);
        glEnd();
        glFlush();
        glDisable(GL_BLEND);
        glPopMatrix();

где:

pushedX=buttonPressCoordinates.x();
pushedY=buttonPressCoordinates.y();
currentX=mouseCurrentPosition.x();
currentY=mouseCurrentPosition.y();

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

НО:

проблема в том, что даже когда я нажимаю мышью где-нибудь на виджете и не двигаю его, он генерирует случайным образом (как я думаю) некоторые (x, y) и соединяет их линией с координатами нажатой позиции мыши . Хотя, когда я начинаю двигать мышь, она начинает работать нормально.

Пожалуйста, помогите исправить эту ошибку.

ИЗМЕНИТЬ

Код присвоения текущих значений мыши

void MainWindow::mouseMoveEvent(QMouseEvent *eventMove)
{
    if(eventMove->buttons() & Qt::LeftButton)
    {
        GLWidget *widget = this->findChild<GLWidget *>("glwidget");
        float x = widget->getNormalizedWidth(widget->mapFromGlobal(QCursor::pos()).x());
        float y = widget->getNormalizedHeight(widget->mapFromGlobal(QCursor::pos()).y());
        float y_ = 1.0 - y;
        mouseCurrentPosition.setX(x);
        mouseCurrentPosition.setY(y_);
        widget->setCurrentX(mouseCurrentPosition.x());
        widget->setCurrentY(mouseCurrentPosition.y());
    }
}

Примечание: QPointF mouseCurrentPosition;, getNormalizedWidth(...) — это моя определенная функция, которая отлично работает.

EDIT-2

Координаты щелчка мыши обновляются следующим образом:

setMouseTracking(true);
m = true;
GLWidget *widget = this->findChild<GLWidget *>("glwidget");
float x = widget->getNormalizedWidth(widget->mapFromGlobal(QCursor::pos()).x());
float y = widget->getNormalizedHeight(widget->mapFromGlobal(QCursor::pos()).y());
float y_ = 1.0 - y;
buttonPressCoordinates.setX(x);
buttonPressCoordinates.setY(y_);
qDebug() << buttonPressCoordinates.x() << buttonPressCoordinates.y();
widget->setQ(true);
widget->setPushedX(buttonPressCoordinates.x());
widget->setPushedY(buttonPressCoordinates.y());

person Mike    schedule 03.09.2013    source источник
comment
Как часто вы обновляете currentX и currentY?   -  person Paddyd    schedule 03.09.2013
comment
@Paddyd всякий раз, когда моя мышь перемещается по виджету.   -  person Mike    schedule 03.09.2013
comment
@Paddyd простаивал - что ты имеешь в виду?   -  person Mike    schedule 03.09.2013
comment
Это происходит только при первом нажатии?   -  person Paddyd    schedule 03.09.2013
comment
@Paddyd это происходит после каждого клика, НО иногда (случайно) этого не происходит. Например, если я начну очень быстро нажимать, ошибка может не появиться еще 2 клика, а затем снова появится.   -  person Mike    schedule 03.09.2013
comment
@Paddyd извините, я думаю, это был не ваш комментарий, просто кто-то прокомментировал и удалил комментарий, я думал, что это было написано вами. Извиняюсь.   -  person Mike    schedule 03.09.2013
comment
Это должно быть как-то связано с вашим присвоением значений currentX и currentY. Можете ли вы включить этот код, пожалуйста?   -  person Paddyd    schedule 03.09.2013
comment
@Paddyd Пожалуйста, посмотрите пост, отредактированный через минуту.   -  person Mike    schedule 03.09.2013
comment
давайте продолжим обсуждение в чате   -  person Mike    schedule 03.09.2013


Ответы (1)


Вы можете попробовать обновить currentX и currentY в mouseMoveEvent, когда LeftButton не нажата:

void MainWindow::mouseMoveEvent(QMouseEvent *eventMove)
{

     GLWidget *widget = this->findChild<GLWidget *>("glwidget");
     float x = widget->getNormalizedWidth(widget->mapFromGlobal(QCursor::pos()).x());
     float y = widget->getNormalizedHeight(widget->mapFromGlobal(QCursor::pos()).y());
     float y_ = 1.0 - y;

    if(eventMove->buttons() & Qt::LeftButton)
    {      
        buttonPressCoordinates.setX(x);
        buttonPressCoordinates.setY(y_);      
        widget->setPushedX(buttonPressCoordinates.x());
        widget->setPushedY(buttonPressCoordinates.y());
    }
    else
    {
        mouseCurrentPosition.setX(x);
        mouseCurrentPosition.setY(y_);
        widget->setCurrentX(mouseCurrentPosition.x());
        widget->setCurrentY(mouseCurrentPosition.y());
    }
}
person Paddyd    schedule 03.09.2013
comment
виджет-›setCurrentX(mouseCurrentPosition.x()); виджет-›setCurrentY(mouseCurrentPosition.y()); это обновление - person Mike; 03.09.2013
comment
Нет, все еще не могу поймать ошибку :( - person Mike; 04.09.2013
comment
Это тоже не помогло. Я сделал несколько тестов, чтобы понять, как генерируются очки. Я заметил, что каждые n секунд позиция мыши пересохраняется в виджете. И линии рендерятся в эти повторно сохраненные координаты. - person Mike; 04.09.2013