2013-09-03 1 views
0

У меня есть 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(); 

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

НО:

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

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

EDIT

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

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(...) мой определен fundction, который отлично работает.

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()); 
+0

Как часто вы обновляете currentX и currentY? – Paddyd

+0

@Paddyd всякий раз, когда мышь перемещается над виджетами. – Mike

+0

@ Паддыд «холостой» - что вы имеете в виду? – Mike

ответ

0

Одна вещь, вы можете попробовать это обновить 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()); 
    } 
} 
+0

widget-> setCurrentX (mouseCurrentPosition.x()); widget-> setCurrentY (mouseCurrentPosition.y()); это обновление – Mike

+0

Удалось ли вам заставить это работать? – Paddyd

+0

Nop, до сих пор не удается поймать ошибку :( – Mike