gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:45:07 32 4
gpt4 key购买 nike

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

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