opengl中鼠标移动、单击、滚轮事件

该博客介绍了在OpenGL中如何处理鼠标按下、移动和滚轮事件。通过全局变量记录鼠标位置,并根据左键和右键的不同操作更新旋转角度,实现三维视图的旋转。同时,利用滚轮事件改变缩放比例,更新OpenGL显示。
摘要由CSDN通过智能技术生成
全局变量(定义在类中的):
QPoint lastPos;//鼠标的位置
GLfloat xrot=yrot=zrot=0;//旋转轴




void GLWidget16::mousePressEvent(QMouseEvent *e)
{
    lastPos = e->pos();
}

void GLWidget16::mouseMoveEvent(QMouseEvent *e)
{
    GLfloat dx = GLfloat(e->x() - lastPos.x()) / width();
    GLfloat dy = GLfloat(e->y() - lastPos.y()) / height();
    if (e->buttons() & Qt::LeftButton) {
        xrot -= 180 * dy;
        yrot -= 180 * dx;
        updateGL();
    } else if (e->buttons() & Qt::RightButton) {
        xrot += 180 * dy;
        zrot += 180 * dx;
        updateGL();
    }
    lastPos = e->pos();
}

void GLWidget16::wheelEvent(QWheelEvent *e)
{
    double numDegrees = -e->delta() / 8.0;
    double numSteps = numDegrees / 15.0;
    scaling *= pow(1.125, numSteps);
    updateGL();
}
在QOpenGLWidget,当处理鼠标移动事件时,需要确保事件处理与OpenGL渲染之间的同步。因为鼠标事件可能会打断正在进行的渲染过程,导致界面卡顿。以下是一个基本的同步策略: 1. **事件缓冲**: 使用QApplication的`postEvent()`函数将鼠标移动事件缓冲起来,让当前的OpenGL绘制任务完成后才处理它。这样做可以确保事件不会立即打断正在运行的渲染进程。 ```cpp void MyOpenGLWidget::mouseMoveEvent(QMouseEvent *event) { QApplication::postEvent(this, event); // 将事件放入消息队列 update(); // 强制更新屏幕(可能不是最优选择,看情况调整) } void MyOpenGLWidget::paintGL() { // ... 执行OpenGL渲染 // 渲染结束后,再处理鼠标移动事件 QEvent *e = qApp->removeEventFromQueue(this); // 取出并处理事件 if (e && e->type() == QEvent::MouseMove) { mouseMoveEvent(static_cast<QMouseEvent*>(e)); } } ``` 2. **异步处理**: 如果你的应用支持多线程,可以考虑在渲染完后在另一个线程处理鼠标移动事件,这样就不会影响主渲染线程了。但是要注意跨线程通信的问题以及数据同步。 3. **事件分发机制**: 考虑使用Qt事件分发机制,如`QOpenGLWidget`本身会自动处理一些低级别的细节,确保渲染和事件处理的协同工作。 总的来说,关键在于保证鼠标事件不会在OpenGL绘制过程频繁地断,并尽可能利用Qt提供的事件处理机制来优化性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值