我正在尝试使用 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/