Monday, August 01, 2011

QGLWidget 使用 paintEvent 与 paintGL 的区别

QGLWidget 提供了 OpenGL 的封装,通常我们不必写独立的 paintEvent 而只需要重写 paintGL 事件即可。如果需要利用 QPainter 实现基本的 over painting(在 OpenGL 场景上绘制独立的 2D 图案或者文字),我们就有必要在 paintEvent 里面进行修改而不是改 paintGL。

那么应该如何修改 paintEvent 呢(和修改 paintGL 的区别)?我发现主要有下面几点:
  • paintEvent 里面必须创建 QPainter 对象,不论画或者不画 2D 的东西,否则结果不对;我曾很天真的认为如果我不画 2D 的,就没必要创建 QPainter,这是完全不对的。
  • paintEvent 里面需要完全依照先 glPushMatrix 最后 glPopMatrix 的逻辑来写,还需要手工设置 viewport;之后才能利用 QPainter 画图;如果直接写 paintGL 是可以偷懒的;
  • 我原先因为偷懒所以 selection 部分就没有弄完整的画图动作,这在 paintEvent 实现里面是不行的,必须全部实现 OK;