QGLWidget: перекраска с помощью QPainter

Я хотел бы нарисовать наложение на моем средстве просмотра изображений: пунктирный прямоугольник вокруг изображения, указывающий ограничивающий прямоугольник.
Вот что я делаю в paintEvent функция:

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();

И initializeGL функция:

    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 при выходе с:
‘QGLContext :: makeCurrent: невозможно сделать текущий контекст недействительным’.
Я знаю, что это исходит от QPainter, а не от чего-то другого в моей программе.

Я попытался переместить код в функции paintGL в другую функцию, которая не является виртуальной, но это ничего не изменило.

1

Решение

Сначала вы должны выполнить вызовы OpenGL, очистить состояние OpenGL, а затем обернуть ВСЕ вызовы отрисовки QPainter между QPainter :: begin (QGLWidget *) и QPainter :: end (QGLWidget *).

Ваша программа, скорее всего, вызывает проблему, потому что вы чередуете вызовы рисования QPainter и OpenGL. Когда вы создаете экземпляр объекта QPainter с помощью QPainter (QPaintDevice *), вы указываете QPainter использовать собственные средства рисования QGLWidget для выполнения операций QPainter. Итак … QPainter использует вызовы фиксированных функций OpenGL для выполнения 2D-рисования, и это может мешать вашим вызовам рендеринга OpenGL, когда ваше состояние не было очищено.

Я предлагаю следовать этому руководству:

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]