c++ - QOpenGLWidget 的makeCurrent 不起作用?

标签 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 );
}

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

最佳答案

正如 Fabio 和 G.M. 在评论部分所解释的那样,如果在设置足够之前调用 QOpenGLWidget::makeCurrent 将无法工作

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

除了了解这一点并听取评论中的建议外,还可以使用 QOpenGLWidget::context方法来判断QOpenGLWidget是否处于初始化状态。根据链接文档(以及实践中所见),context 方法返回“0 if not yet initialized”,否则返回非空指针。因此,这是一种确定 QOpenGLWidget::makeCurrent 是否调用 QOpenGLContext::makeCurrent 的方法,也是一种部分解决 QOpenGLWidget::makeCurrent 的方法返回 void。这在这种情况下可能不是特别有用,但在其他相关上下文中可能很有用,所以我认为这值得一提。

所以要让 QOpenGLWidget::makeCurrent 真正成功,必须在 QOpenGLWidget 完成之后调用 QOpenGLWidget::makeCurrent已初始化以使其正常工作

阅读这个问题的字里行间,听起来好像想知道需要做什么才能使 GL 调用起作用。正如问题的作者所认识到的那样,将 GL 调用延迟到 aboutToCompose 信号被触发,可以解决这个问题(至少在该用户代码的上下文中)。另一种方法是使 QOpenGLWidget 可见,然后调用 GL 代码。

希望这能完全回答您的问题,如果不是至少有帮助的话。

关于c++ - QOpenGLWidget 的makeCurrent 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49400748/

相关文章:

c++ - 我如何在 Qt 中从 Internet 下载文件?

java - OpenGL:单个顶点缓冲区中的两个球体

c++ - 使用接口(interface)会减慢程序速度吗?

c++ - 为什么〜size_t(0)(在大多数32位系统中== 0xFFFFFFFF)不是有效的数组索引?

C++ "Error expected a ' )'"

multithreading - 如何从Qtreeview中删除项目?

c++ - QTestLib 是否可以在运行时显示它正在测试的 GUI?

c++ - 如何使用 C++11 move 语义来显式避免复制

c++ - 处理多个灯光和 GLSL 着色器程序

c++ - GLSL:未呈现制服的变化