I managed to get it working and will post the relevant bits of code in case anyone else needs them in the future.
@mouseLockedFlag = false;
mouseJustLocked = false;
userRotSpeedX=userRotSpeedY=userRotSpeedZ=.1;
@
@void MyGLWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
if (mouseLockedFlag)
{
mouseLockedFlag = false;
MyGLWidget::setCursor(Qt::ArrowCursor);
}
else
{
mouseJustLocked = true;
mouseLockedFlag = true;
MyGLWidget::setCursor(Qt::BlankCursor);
}
}@
@
QPoint widgetM = QWidget::mapToGlobal(QPoint(QWidget::size().width()/2,QWidget::size().height()/2));
if (mouseJustLocked)
{
QCursor::setPos(widgetM);
mouseJustLocked = false;
}
QPoint cursorP = QCursor::pos();
float xDiff = cursorP.x()-widgetM.x();
float yDiff = cursorP.y()-widgetM.y();
float mouseDist = someMath::squRoot(xDiffxDiff + yDiffyDiff);
float freeRoom = (QWidget::size().width() > QWidget::size().height() ? QWidget::size().height() : QWidget::size().width())/3;
if (mouseLockedFlag)
{
if (freeRoom < mouseDist)
{
float newX = widgetM.x() + xDifffreeRoom/mouseDist;
float newY = widgetM.y() + yDifffreeRoom/mouseDist;
QCursor::setPos(newX,newY);
}
}
if(timer.elapsed() > 1000/EXEC_PER_SECOND_CAP)
{
timer.restart();
timer.start();
if (mouseLockedFlag)
{
if (mouseDist != 0)
{
float newX = widgetM.x() + xDiff*qLn(mouseDist)/mouseDist;
float newY = widgetM.y() + yDiff*qLn(mouseDist)/mouseDist;
userRotX += userRotSpeedX*yDiff;
userRotY += userRotSpeedY*xDiff;
QCursor::setPos(newX, newY);
}
}
}@
@
glRotatef(userRotX, 1.0, 0.0, 0.0);
glRotatef(userRotY, 0.0, 1.0, 0.0);
glRotatef(userRotZ, 0.0, 0.0, 1.0);
glTranslatef(userX, userY, userZ);@