QGLWidget拒绝绘制任何东西

时间:2013-02-08 00:49:53

标签: c++ qt opengl qt4 qglwidget

我看过很多关于OpenGL的文章和问题,而不是绘图,常见的错误等等。这个问题让我很难过。

我为glOrtho,不同的顶点位置,颜色等尝试了几种不同的设置,但都无济于事。

可以确认 OpenGL状态是有效的,因为代码中的清晰颜色 紫色(意味着窗口 紫色)。 gDEBugger还确认正在更新帧(Fraps也是如此)。

这是代码。标记为“没有帮助”的行原本不存在,并且是我尝试过但失败的事情。

QTWindow::QTWindow( )
{
    // Enable mouse tracking
    this->setMouseTracking(true);
}

void QTWindow::initializeGL()
{
    // DEBUG
    debug("Init'ing GL");
    this->makeCurrent(); ///< Didn't help
    this->resizeGL(0, 0); ///< Didn't help
    glDisable(GL_CULL_FACE); ///< Didn't help
    glClearColor(1, 0, 1, 0);
}

void QTWindow::paintGL()
{
    // DEBUG
    debug("Painting GL");
    this->makeCurrent(); ///< Didn't help
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,1,1);
    glBegin(GL_TRIANGLES);
    glVertex2f(500,100);
    glVertex2f(100,500);
    glVertex2f(0,0);
    glEnd();
    this->swapBuffers(); ///< Didn't help
}

void QTWindow::resizeGL(int width, int height)
{
    // DEBUG
    debug("Resizing GL");
    this->makeCurrent(); ///< Didn't help
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1000, 0, 1000, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

即使关闭剔除,三角也根本不显示。但是,所有三个调试日志都被称为它们应该是什么样的。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

尝试在QTWindow :: resizeGL()函数的最开头调用glViewport()函数:

glViewport(0, 0, width, height);

并且不要在 width height 设置为0的情况下调用resizeGL();除此之外,您无需直接调用resizeGL()因为只要窗口调整大小,Qt就会调用它。

您可以删除对swapBuffers()函数的所有调用 - 它由Qt在内部调用。

应该在所有其他GL调用之前调用makeCurrent()函数,因此最好在initializeGL()中调用它,但是你不必在paintGL()函数中调用它(除非paintGL( )正在从另一个线程调用,但我打赌它不在你的代码中)。

答案 1 :(得分:0)

问题最终成为版本。使用glGetString(GL_VERSION)返回的版本字符串表示正在使用4.2兼容性上下文。

由于3.1中删除了paintGL方法中的三角形调用(如果我没记错),很明显为什么他们没有绘制任何东西。此外,没有错误被抛出,因为它是compat。模式。

因为我无法在QGLWidget上将版本降低到3.0以下(由于QT需要2.1,因为我在另一个留言板上得知),我将版本设置为3.0并尝试使用一些3.0绘图调用它结束了工作。