Qt QOpenGLWidget鼠标滚轮事件表现奇怪

3

我有以下类:

class Curve2DOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core {
Q_OBJECT   
public:

    Curve2DOpenGLWidget( QWidget* parent = nullptr );
    ~Curve2DOpenGLWidget();  

    void initializeGL() override;
    void resizeGL(int width, int height) override;
    void paintGL() override;
    void NativePaintGL();

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;

};

我想在我的场景中使用wheelEvent来缩放。

以下是代码:

void Curve2DOpenGLWidget::wheelEvent( QWheelEvent* event ) {
    QOpenGLWidget::wheelEvent(event);
    float numStep = (event->angleDelta().y() / 8) / 15;
    m_camera.MoveFront(numStep * 0.1f);
}

它做我想要的事情,但当我同时移动鼠标并使用鼠标滚轮时,该事件不会被调用

这个代码在我实现的所有其他小部件(QGraphicsView等)上都运行良好。我想知道在QOpenGLWidget上是否有什么特别的工作要做?

我无法解释这种行为…如果可以帮助的话,我正在使用Ubuntu 14.04 LTS。

3个回答

1
我遇到了同样的问题。
在我的情况下,是基于 QTimer 的渲染循环以100 FPS更新4个 QOpenGLWidget 和窗口标题栏(实际上相当耗费CPU),在Linux上出现了这个问题,但在Windows上没有出现。
qoglwidgets的更新事件和鼠标移动事件可能比滚轮事件在事件循环中具有更高的优先级。滚轮事件似乎不会被丢弃,而是被累积并与下一个“通过”的事件一起到达。
幸运的是,用例允许使用事件驱动的实现来替换此渲染循环,从而避免了这个问题。

1

1
设置这些属性并没有解决这个问题。 - Jeff G

0

来自Qt 文档

当鼠标按钮在小部件内按下或释放时,或者当鼠标光标移动时,会发生鼠标事件。

只有在按下鼠标按钮时,鼠标移动事件才会发生,除非使用QWidget::setMouseTracking()启用了鼠标跟踪。

因此,在您的构造函数中需要设置setMouseTracking(true)。


setMouseTracking(true)不能解决我的问题。当我同时使用鼠标滚轮并移动时,wheelEvent()没有被调用。 - Mehdi-Antoine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接