gpt4 book ai didi

c++ - QGL小部件: overpainting with QPainter

转载 作者:行者123 更新时间:2023-11-30 02:00:34 26 4
gpt4 key购买 nike

我想在我的图像查看器上绘制一些叠加层:图像周围的虚线矩形,表示边界框。这是我在 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 函数中的代码移动到另一个非虚拟函数,但没有改变任何东西。

最佳答案

您应该首先执行 OpenGL 调用,清除您的 OpenGL 状态,然后将所有 QPainter 绘制调用包装在 QPainter::begin(QGLWidget *)QPainter::end(QGLWidget *)< 之间.

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

我建议遵循本指南:

https://doc.qt.io/archives/qt-4.8/qt-opengl-overpainting-example.html

关于c++ - QGL小部件: overpainting with QPainter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14996717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com