0

i'm trying to make a fps camera while using QOpenGLWidget, gamer will have a CrossCursor in the center of the screen like most games do.

But when i use

QCursor::setPos(geometry().center());

the cursor is jumpy, and bounces all over; it really annoys me. Here is my code:

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    float xoffset = event->position().x() - rect().center().x();
    float yoffset = rect().center().y() - event->position().y();
    if(firstMouse){
        xoffset = event->position().x();
        yoffset = event->position().y();
        firstMouse = false;
    }
    camera->processMouseMovement(xoffset,yoffset);//camera process
    QCursor::setPos(geometry().center());// keep cenetered
    QOpenGLWidget::mouseMoveEvent(event);
}

I don't really know if this mouseMoveEvent in QOpenGLWidget is same as in the QWidget, or maybe there is a better way to implement this function.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
cooronx
  • 1
  • 1

1 Answers1

0

Could use :

    QPoint glob = mapToGlobal(QPoint(width()/2,height()/2));
    QCursor::setPos(glob);

2023 04 20 result: I used the Qt Creator example 'OpenglWindow', which uses QWindow, and modified it to use QWidget instead.

If you want to keep the mouse cursor visible and centered in the window, you can use the setCursor() method of the QWidget class to set the mouse cursor to Qt::BlankCursor to hide it, and then draw a crosshair or other marker in the center of the window to replace the mouse cursor.

void OpenGLWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::white, 2));

QRect rect = geometry();
QPoint center = rect.center();

int size = 10;
painter.drawLine(center.x() - size, center.y(), center.x() + size, center.y());
painter.drawLine(center.x(), center.y() - size, center.x(), center.y() + size);
}

void OpenGLWindow::mouseMoveEvent(QMouseEvent *event)
{
QRect rect = geometry();
float xoffset = event->pos().x() - rect.center().x();
float yoffset = rect.center().y() - event->pos().y();
if(firstMouse){
    xoffset = event->pos().x();
    yoffset = event->pos().y();
    firstMouse = false;
}
camera->processMouseMovement(xoffset,yoffset);//camera process
QPoint center = rect.center();
QCursor::setPos(mapToGlobal(center)); 
setCursor(Qt::BlankCursor); 
QWindow::mouseMoveEvent(event);
}

Also, mapToGlobal may not be needed.

cfl997
  • 43
  • 7