C++ QOpenGLWidget全屏切换

C++ QOpenGLWidget全屏切换,c++,windows,qt,opengl,qt5,C++,Windows,Qt,Opengl,Qt5,我在Windows上使用Qt 5.6(使用opengl桌面标志构建,无角度),我有一个小部件继承QOpenGLWidget,如下所示: class SomeWidget: public QOpenGLWidget, protected QOpenGLFunctions { ... } 此小部件添加到主窗口的布局中,并将主窗口作为父窗口。OpenGL的东西显示得很好。我希望最大化或全屏显示该小部件,然后将其恢复到主窗口中的位置/大小。代码如下所示: onFullscreen() {

我在Windows上使用Qt 5.6(使用opengl桌面标志构建,无角度),我有一个小部件继承QOpenGLWidget,如下所示:

class SomeWidget: public QOpenGLWidget, protected QOpenGLFunctions
{
    ...
}
此小部件添加到主窗口的布局中,并将主窗口作为父窗口。OpenGL的东西显示得很好。我希望最大化或全屏显示该小部件,然后将其恢复到主窗口中的位置/大小。代码如下所示:

onFullscreen()
{
    // remove widget from layout
    // set widget's parent to NULL
    // create a new dialog / layout and add widget to it
    // call dialog->showFullScreen
}

onRestore()
{
    // set parent to main window
    // insert in main window layout
    // restore original size
    // close dialog
}
我还在main()中添加了:

当我进入全屏时,我会看到一个黑屏,看不到红色的清晰颜色。没有错误消息

有趣的是,如果我将dialog->showFullScreen()替换为dialog->showMaximized(),原始渲染将消失,并且我看不到其他对话框

我有同样的方法来显示另一个小部件全屏,它不派生QOpenGLWidget,而且工作正常

关于正在发生的事情以及如何实现全屏显示QOpenGLWidget并将其恢复到主窗口中的位置,有什么想法吗


非常感谢

为什么不以全屏模式显示主窗口(并扩展小部件以完全覆盖它)?感谢c-smile的反馈。您将如何扩展小部件以全面覆盖?我认为另一种解决方案更好,因为如果我创建另一个对话框,当我有第二个监视器时,我仍然可以访问控件。我有一种非常强烈的感觉,你不能那么容易地“重新发布”OpenGL小部件。OpenGL与创建它的窗口上下文绑定。我怀疑创建另一个OpenGL窗口并在那里重新渲染东西将是最简单的事情。@c-smile:OpenGL上下文与创建它们的窗口没有关联。不幸的是,Qt(以及许多其他)框架并没有很好地公开这一点。在Qt-4和Qt-5中使用此功能几乎是不可能的,但这并不是微不足道的。但是一个OpenGL上下文肯定可以与几个不同的窗口一起使用。为什么不以全屏模式显示主窗口(并扩展小部件以完全覆盖它)?感谢c-smile的反馈。您将如何扩展小部件以全面覆盖?我认为另一种解决方案更好,因为如果我创建另一个对话框,当我有第二个监视器时,我仍然可以访问控件。我有一种非常强烈的感觉,你不能那么容易地“重新发布”OpenGL小部件。OpenGL与创建它的窗口上下文绑定。我怀疑创建另一个OpenGL窗口并在那里重新渲染东西将是最简单的事情。@c-smile:OpenGL上下文与创建它们的窗口没有关联。不幸的是,Qt(以及许多其他)框架并没有很好地公开这一点。在Qt-4和Qt-5中使用此功能几乎是不可能的,但这并不是微不足道的。但是一个人肯定可以在几个不同的窗口中使用一个OpenGL上下文。
app.setAttribute(Qt::AA_ShareOpenGLContexts); // onFullscreen() crashes if this line is not present