我有以下类:
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
发布于 2018-06-28 08:48:54
我确实遇到了同样的问题。
在我的例子中,它是一个基于QTimer
的渲染循环,它以100FPS的速度更新4FPS和窗口的标题栏(这实际上是相当占用QOpenGLWidget
的)。
它不是在Windows上表现出来的,而是在Linux上。
在事件循环中,qoglwidget和鼠标移动事件的更新事件可能比滚轮事件具有更高的优先级。轮子事件似乎不会被丢弃,但会累积起来,并与»通过«的下一个事件一起到达。
幸运的是,用例允许用事件驱动的实现替换这个呈现循环,避免了这个问题。
发布于 2019-01-21 16:41:25
请参阅http://doc.qt.io/qt-5/qt.html#ApplicationAttribute-enum中的Qt::AA_CompressHighFrequencyEvents和Qt::AA_CompressTabletEvents
这些是Qt 5中的新属性。
https://stackoverflow.com/questions/40673477
复制相似问题