我有以下课程:
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
答案 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中的新属性。