QOpenGLWidget的makeCurrent不起作用?

时间:2018-03-21 07:46:48

标签: c++ qt opengl

我正在尝试使用QOpenGLWidget而不进行子类化。

当我尝试在QOpenGLWidget的方法或信号之外进行OpenGL调用时,似乎没有任何事情发生。例如,尽管我设置了glClearColor

,但以下代码会清除窗口黑色
MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
    auto glw = new QOpenGLWidget( this );
    glw->makeCurrent();
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glw->doneCurrent();

    connect( glw, &QOpenGLWidget::aboutToCompose, [=] {
        glClear( GL_COLOR_BUFFER_BIT );
    });

    setCentralWidget( glw );
}

但是,当我在连接到glClearColor信号的lambda内移动aboutToCompose时,窗口小部件将被清除为白色。

2 个答案:

答案 0 :(得分:1)

正如Fabio和G.M.在评论部分中所解释的, Id如果在设置足够东西之前调用,将无法工作

从Qt 5.11以及可能的其他发行版开始,QOpenGLWidget::makeCurrent通过调用QOpenGLContext::makeCurrent方法来工作。但是,仅当QOpenGLWidget::makeCurrent已处于初始化状态时,才发生该调用。此外,QOpenGLWidget可能会失败。后者至少通过其QOpenGLContext::makeCurrent返回参数给出了一些失败指示。不幸的是,bool完全没有给出任何指示。 QOpenGLWidget::makeCurrent静默失败

除了了解此信息并听取注释中的建议外,还可以使用QOpenGLWidget::context方法来确定QOpenGLWidget::makeCurrent是否处于初始化状态。根据链接的文档(以及在实践中看到的),QOpenGLWidget方法返回“ 0(如果尚未初始化)”,否则返回非null指针。因此,这是确定context是否调用QOpenGLWidget::makeCurrent的一种手段,并且是部分解决QOpenGLContext::makeCurrent返回QOpenGLWidget::makeCurrent的一种手段。在这种情况下,这可能不是特别有用,但是在其他相关上下文中可能有用,因此我认为值得一提。

因此,要使void真正成功,必须在QOpenGLWidget::makeCurrent初始化后调用 QOpenGLWidget::makeCurrent才能使其正常工作。 >

仔细阅读这个问题的内容,听起来好像想知道要使GL调用正常工作需要做什么。正如问题的作者所认识到的那样,将GL调用延迟到触发QOpenGLWidget信号为止,对此有效(至少在该用户代码的上下文中)。另一种方法是使aboutToCompose可见,然后调用GL代码。

希望这至少在没有帮助的情况下能完全回答您的问题。

答案 1 :(得分:1)

您可以致电auto *ctx = QOpenGLContext::currentContext();来检查makeCurrent是否成功。