2013-02-21 113 views
1

我想在图像查看器上绘制一些覆盖图:图像周围的虚线矩形,指示边界框。 下面介绍一下我在paintEvent功能做:QGLWidget:使用QPainter覆盖

void ViewerGL::paintEvent(QPaintEvent* event){ 
    makeCurrent(); 
    QPainter p(this); 
    glClearColor(0.0,0.0,0.0,0.0); 
    glClear(GL_COLOR_BUFFER_BIT); // << If I don't do this it clears out my viewer white 
// and I want it black 

    p.setBackgroundMode(Qt::TransparentMode); // < was a test, doesn't seem to do anything 
    p.setBackground(QColor(0,0,0,0)); 

    //loading the appropriate shader before texture mapping 
    if(rgbMode() && _shaderLoaded){ 
     shaderRGB->bind(); 
    }else if(!rgbMode() && _shaderLoaded){ 
     shaderLC->bind(); 
    } 
    paintGL(); // render function (texture mapping) 
    //drawing a rect around the texture on the viewer 
    QPen pen(Qt::DashLine); 
    pen.setColor(QColor(233,233,233)); 
    p.setPen(pen); 
    QPoint btmRight=mousePosFromOpenGL(dataWindow().w(),dataWindow().h() +transY*2 + (zoomY-dataWindow().h()/2)*2); 
    QPoint btmLeft=mousePosFromOpenGL(0,dataWindow().h() +transY*2 + (zoomY-dataWindow().h()/2)*2); 
    QPoint topLeft=mousePosFromOpenGL(0,0 +transY*2 + (zoomY-dataWindow().h()/2)*2); 
    QPoint topRight=mousePosFromOpenGL(dataWindow().w(), 0+ +transY*2 + (zoomY-dataWindow().h()/2)*2); 
    p.drawLine(topLeft,topRight); 
    p.drawLine(topRight,btmRight); 
    p.drawLine(btmRight,btmLeft); 
    p.drawLine(btmLeft,topLeft); 
    QPoint pos = mousePosFromOpenGL((dataWindow().w()) + 10 , 
            (dataWindow().h()) +transY*2 + (zoomY-dataWindow().h()/2)*2 +10); // bottom right of the texture +10 
    p.drawText(pos, _resolutionOverlay); 

    p.end(); 

} 

这里是我在paintGL功能做:

glPushAttrib(GL_ALL_ATTRIB_BITS); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

... my drawing code 

    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 

    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 

    glPopAttrib(); 

而且​​功能:

initAndCheckGlExtensions(); 
    glClearColor(0.0,0.0,0.0,0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glGenTextures (1, texId); 
    glGenTextures (1, texBlack); 

    glGenBuffersARB(1, &texBuffer); 

    shaderBlack=new QGLShaderProgram(context()); 
    shaderBlack=new QGLShaderProgram(context()); 
    if(!shaderBlack->addShaderFromSourceCode(QGLShader::Vertex,vertRGB)) 
     cout << shaderBlack->log().toStdString().c_str() << endl; 
    if(!shaderBlack->addShaderFromSourceCode(QGLShader::Fragment,blackFrag)) 
     cout << shaderBlack->log().toStdString().c_str() << endl; 
    if(!shaderBlack->link()){ 
     cout << shaderBlack->log().toStdString().c_str() << endl; 
    } 

所以远远的工作,我有我想要的,但我的程序是洪水stderr出口: 'QGL Context :: makeCurrent:无法生成无效的上下文当前'。 我知道这是来自QPainter,而不是来自我的程序中的其他东西。

我试着将paintGL函数中的代码移动到另一个不是虚拟的函数,但没有改变任何东西。

+0

告诉我们在哪儿定义的上下文。 – cmannett85 2013-02-21 07:57:13

+0

以及QGLContext对象是使用默认设置自动创建的,但是这里是initialiazeGL函数(在主要文章中) – Lex 2013-02-21 08:49:55

回答

3

您应该首先执行OpenGL调用,清除OpenGL状态,然后在QPainter :: begin(QGLWidget *)和QPainter :: end(QGLWidget *)之间包装ALL QPainter绘图调用。

您的程序很可能会导致问题,因为您交错QPainter和OpenGL绘图调用。当您使用QPainter(QPaintDevice *)实例化QPainter对象时,您告诉QPainter使用QGLWidget的本机绘图工具来执行QPainter操作。因此... QPainter使用OpenGL固定函数调用来执行2D绘图,并且当您的状态尚未清除时,它可能会干扰OpenGL呈现调用。

我建议按照本指南:

http://harmattan-dev.nokia.com/docs/library/html/qt4/opengl-overpainting.html

+0

谢谢,同时我放弃了所有QPainter的东西,并且在openGL代码中编写了所有东西......它比从你自己 – Lex 2013-02-27 15:45:12

+0

很高兴在这里工作! Qt对于openGL开发来说确实是一个很好的选择。如果你使用纯粹固定的函数管道调用,我推荐学习QtQuick 2.0(作为QT 5.0的一部分)。这真是太棒了。 – 2013-02-27 19:54:44

+0

指南的链接已经死了,你有什么想法如何命名文档,以便可以尝试谷歌它? – theV0ID 2015-04-05 20:56:28