1

画像ビューアにオーバーレイを描画したいと思います。画像の周りに破線の長方形があり、境界ボックスを示しています。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;
    }

これまでのところ動作しており、必要なものはありますが、プログラムが終了時に 「QGLContext::makeCurrent: 無効なコンテキストを現在の状態にすることはできません」で stderr をフラッディングしています。 これは私のプログラムの他の何かからではなく、QPainter から来ていることを知っています。

paintGL 関数のコードを、仮想ではない別の関数に移動しようとしましたが、何も変更されませんでした。

4

1 に答える 1

4

最初に OpenGL 呼び出しを実行し、OpenGL の状態をクリアしてから、すべての QPainter 描画呼び出しを と の間でラップする必要がQPainter::begin(QGLWidget *)ありQPainter::end(QGLWidget *)ます。

QPainter と OpenGL の描画呼び出しをインターリーブしているため、プログラムが問題を引き起こしている可能性があります。QPainterオブジェクトをインスタンス化するときQPainter(QPaintDevice *)に、QPainter に QGLWidget のネイティブ描画機能を使用して QPainter 操作を実行するように指示します。そのため... QPainter は OpenGL 固定関数呼び出しを使用して 2D 描画を実行し、状態がクリアされていない場合に OpenGL レンダリング呼び出しに干渉する可能性があります。

このガイドに従うことをお勧めします。

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

于 2013-02-26T11:06:24.550 に答える