Qt5 QOpenglWidget如何确保在mousemove envent期间立即更新场景?

时间:2015-02-18 07:08:04

标签: c++ qt user-interface opengl rubber-band

我目前正在使用Qt和openGL开发一个类似CAD的绘图程序。

我正在做的是我维护画布上的对象列表。 paintGL()函数只是循环遍历列表并逐个呈现对象。

对象通过插槽drawObject(Object obj)提供给列表,其中有update()函数来安排更新事件以更新场景。

现在,我想做一些橡皮筋画线:

选择该行的一个端点后,每当我移动光标时,都会触发mouseMoveEvent(),它将为该行生成一个对象并向drawObject(Object)插槽发出信号。插槽的作用是通过xor绘图擦除旧行,并在xor模式下绘制新行。

我期望发生的是每次鼠标移动时,都会向场景渲染一个新对象。但事实并非如此。例如,如果我移动鼠标 快速,然后在update()函数实际更新场景之前,已经触发了多个mouseMove事件,似乎从未处理过这些事件,即对应对象永远不会进入屏幕。该程序实际上做的是在快速橡皮筋拖动后屏幕上留下了许多随机伪影。

这似乎是因为QOpenGLWidget的update()函数的作用是它生成一个事件来通知窗口小部件稍后重新绘制以达到性能目的。

在我写这个问题的过程中,我发现repaint()函数会立即更新。然而,滞后是非常重要的:当我快速移动鼠标时,橡皮带线没有跟随。

所以,我的问题是,如何实现橡皮带绘图,以便它可以利用更新()机制来提高性能,同时不会在屏幕上出现这些故障?

我一直在搜索这个但我能找到一篇文章谈论这个快速移动的鼠标。

提前谢谢!

0 个答案:

没有答案