我正在尝试使用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
时,窗口小部件将被清除为白色。
答案 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是否成功。