我目前正在使用 Qt 和 openGL 开发一个简单的类似 CAD 的绘图程序。
我正在做的是维护画布上的对象列表。该paintGL()
函数只是遍历列表并一一渲染对象。
对象通过 slot 馈送到列表drawObject(Object obj)
中,其中有一个update()
函数可以安排更新事件以更新场景。
现在,我想做一些橡皮筋画线:
选择线条的一个端点后,每当我移动光标时,mouseMoveEvent()
都会触发 a ,它将为线条生成一个对象并向drawObject(Object)
插槽发出信号。插槽的作用是通过进行异或绘制来擦除旧线,并在异或模式下绘制新线。
我期望发生的是,每次移动鼠标时,都会将一个新对象渲染到场景中。然而,事实并非如此。例如,如果我快速移动鼠标,那么在 update() 函数实际更新场景之前,已经触发了多个 mouseMove 事件,并且似乎从未处理这些事件,即对应对象从未进入屏幕。该程序实际上所做的是,在快速拖动橡皮筋后,屏幕上会留下很多随机伪影。
这似乎是由于 QOpenGLWidget 的 update() 函数所做的是它生成一个事件来通知小部件稍后重绘以达到性能目的。
在我写这个问题的过程中,我发现repaint()
了立即更新的功能。但是,滞后非常显着:当我快速移动鼠标时,橡皮筋线没有跟随。
所以,我的问题是,如何实现橡皮筋绘图,以便它可以利用 update() 机制来提高性能,同时不会在屏幕上出现这些故障?
我对此进行了搜索,但我可以找到一篇关于这种快速移动鼠标的文章。
先感谢您!