我有以下类(class):

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

最佳答案

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

就我而言,这是一个基于QTimer的渲染循环,它以100 FPS的速度更新了4个QOpenGLWidget和窗口的标题栏(实际上是占用大量CPU的资源)。
它没有出现在Windows上,但是出现在Linux上。

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

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

关于c++ - Qt QOpenGLWidget wheelEvent奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40673477/

10-11 13:05