【问题标题】:Python Qt+OpenGL drawing region bugPython Qt+OpenGL 绘图区域错误
【发布时间】:2018-04-25 10:14:56
【问题描述】:

我有 OpenGl 的简单代码,但绘图区域显示不正确,当我想要全尺寸时,它大约是 100x30。但是,我的 OpenGL 小部件具有适当的清晰行为。我该如何解决这个问题?

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from PyQt4 import QtCore, QtGui, QtOpenGL
import sys
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

try:
    from OpenGL import GL
except ImportError:
    app = QtGui.QApplication(sys.argv)
    QtGui.QMessageBox.critical(None, "OpenGL hellogl",
            "PyOpenGL must be installed to run this example.")
    sys.exit(1)


class Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(700, 532)


        self.openGLWidget = GLWidget(Form)
        self.openGLWidget.setGeometry(QtCore.QRect(10 , 10, 512, 512))
        self.openGLWidget.setObjectName("openGLWidget")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))

class GLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):

        super(GLWidget, self).__init__(parent)


    def initializeGL(self):
        GL.glClearColor(0,255,0,255)

    def paintGL(self):


        glEnable(GL_TEXTURE_2D)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glLoadIdentity()

        gluOrtho2D(0, 1, 0, 1);

        glColor3f(1, 0, 0)
        glDisable(GL_TEXTURE_2D)
        glBegin(GL_QUADS)
        glVertex2i(0, 0)
        glVertex2i(1000, 0)
        glVertex2i(1000, 1000)
        glVertex2i(0, 1000)
        glEnd();

        glFlush()




if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Ui_Form()
    window.show()
    sys.exit(app.exec_())

我尝试更改 glOrtho 并添加一些 glut 函数但没有结果。我也尝试添加矩阵乘法来缩放它,似乎显示区域有一些错误的值。

【问题讨论】:

  • @Rabbid76 现在我只想让我的矩形打破这个 30x80 的区域。是的,我在 1x1 区域中绘制了 1000x1000 矩形,但为什么它在我的小部件上是 30x80?

标签: python qt opengl pyqt4 pyopengl


【解决方案1】:

您必须设置视口大小。见glViewport

void glViewport( GLint x, GLint y, GLsizei width, GLsizei height);

x, y 指定视口矩形的左下角,以像素为单位。初始值为 (0,0)。
width, height 指定视口的宽度和高度。

glViewport 指定xy 从标准化设备坐标到窗口坐标的仿射变换。


你的代码应该看起来像这样:

def paintGL(self):

    width = 512
    height = 512

    glViewport(0, 0, width, height)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(0, width, 0, height)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glColor3f(1, 0, 0)
    glBegin(GL_QUADS)
    glVertex2i(0, 0)
    glVertex2i(width, 0)
    glVertex2i(width, height)
    glVertex2i(0, height)
    glEnd()

    glFlush()

注意,在 OpenGL 中,每种矩阵模式都有一个矩阵堆栈(请参阅glMatrixMode)。矩阵模式为GL_MODELVIEWGL_PROJECTIONGL_TEXTURE。所以你应该设置投影矩阵(GL_PROJECTION)和模型视图矩阵(GL_MODELVIEW),因为每个顶点都是由模型视图矩阵和投影矩阵变换的。


见更远QT + OPENGL CODE EXAMPLE


顺便说一句,glClearColor 的参数是 [0, 1] 范围内的浮点值。换个方法initializeGL

def initializeGL(self):
    GL.glClearColor(0,1,0,1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多