Qt QOpenGLWidget wheelEvent奇怪的行为

时间:2016-11-18 09:28:26

标签: c++ qt

我有以下课程:

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 个答案:

答案 0 :(得分:1)

我确实遇到了同样的问题。

在我的情况下,这是一个基于select t.*,datediff(day,lag(end_date) over(partition by id order by start_date),start_date) as diff from tbl t 的渲染循环,它以100 FPS的速度更新了4个QTimer和窗口的标题栏(实际上是占用大量CPU的时间)。
它没有出现在Windows上,但是出现在Linux上。

qoglwidgets的更新事件和鼠标移动事件在事件循环中的优先级可能高于wheel事件。轮盘事件似乎并没有丢失,但会累积起来并与下一个“通过”事件一起到达。

幸运的是,用例允许使用事件驱动的实现方式替换此呈现循环,从而避免了此问题。

答案 1 :(得分:0)

来自Qt documentation

  

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

     

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

所以你需要在构造函数中使用setMouseTracking(true)

答案 2 :(得分:0)

请参见http://doc.qt.io/qt-5/qt.html#ApplicationAttribute-enum中的Qt :: AA_CompressHighFrequencyEvents和Qt :: AA_CompressTabletEvents

这些是Qt 5中的新属性。