QGLBuffer.allocate与QGLWidget.renderText混淆

时间:2011-11-20 19:46:24

标签: qt opengl

当我调用QGLBuffer.allocate时,QGLWidget.renderText完全停止工作。事实上,如果你重载QGLwidget.paintEvent

,所有QPainter功能都会停止工作

以下PySide代码演示了此问题。它将打开两个QGLwidget窗口:

  • 一个人调用QGLBuffer.allocate,你看不到文字。
  • 其他工作正常。

代码:

from PySide.QtGui import *
from PySide.QtOpenGL import *
from OpenGL.GL import *
import sys

class GLWidget(QGLWidget):

    def __init__(self, alloc=False):
        QGLWidget.__init__(self)
        self.alloc = alloc

    def initializeGL(self):
        self.buffer = buffer = QGLBuffer(QGLBuffer.VertexBuffer)
        buffer.create()
        buffer.bind()
        buffer.setUsagePattern(QGLBuffer.StaticDraw)

        if self.alloc: # If true text will not be drawn
            buffer.allocate(80)

    def resizeGL(self, h, w):
        glViewport(0, 0, h, w)

    def paintGL(self):

        glClearColor(1, 1, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT)

        glColor(0, 0, 0, 1)
        self.renderText(50, 50, "Text to Render")

def main(argv):

    app = QApplication(argv)

    widget = GLWidget(alloc=True)
    widget.show()

    widget2 = GLWidget(alloc=False)
    widget2.show()

    app.exec_()

if __name__ == '__main__':
    main(sys.argv)

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

我不确切知道Qt OpenGL类是如何工作的,但根据我混合Qt和原始OpenGL 3.3的经验,当你完成缓冲时你应该取消绑定,因为它与QPainter正在使用的任何机制混淆。

所以在initializeGL unbind结束之后,在paintGL中绑定/取消绑定。