如何强制Qt使用OpenGL窗口类型?

iyr7buue  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(165)

Qt文档说:
当动态地将QOpenGLWidget添加到小部件层次结构中时,例如通过将一个新的QOpenGLWidget父化到一个窗口小部件,其中对应的顶层窗口小部件已经显示在屏幕上,如果QOpenGLWidget是其窗口内的第一个同类,则相关联的本机窗口可以被隐式地破坏和重新创建。这是因为窗口类型从RasterSurface更改为OpenGLSurface,并且具有特定于平台的含义。这是Qt 6.4中的新特性。
这是我使用Qt 6.4.1(MSVC2019,Windows 10)的情况。当我动态添加一个新的QOpenGLWidget到我的窗口,窗口关闭,并再次打开。这可不妙
我找到了一个变通办法。只需添加到布局中,然后在显示窗口之前删除一个空的QOpenGLWidget

void MainWindow::showEvent( QShowEvent* event )
{
    Q_UNUSED( event )

    QOpenGLWidget w;
    layout()->addWidget( &w );
    layout()->removeWidget( &w );
}

但这似乎是一个肮脏的解决方案。有没有人知道一个更优雅的方法来强制Qt默认使用OpenGL窗口类型?
UPD
上面代码中的MainWindow类派生自QWidget。我尝试在MainWindow::showEvent中调用windowHandle()->setSurfaceType(..)。当我创建QOpenGLWidget时,它会导致应用程序崩溃。由于MainWindowQWidget,我不能在ctor中使用windowHandle(),因为尚未创建窗口对象。

jc3wubiy

jc3wubiy1#

我也遇到了同样的问题...
QT文档似乎只涉及手动创建QWindow并直接在Window中绘图。但是在QWindow文档中,说:https://doc.qt.io/qt-6/qwindow.html#details--> An application will typically use QWidget or QQuickView for its UI, and not QWindow directly. Still, it is possible to render directly to a QWindow with QBackingStore or QOpenGLContext, when wanting to keep dependencies to a minimum or when wanting to use OpenGL directly.
QMainWindow的命名很糟糕,它实际上是一个QWidget。所有的QWidgets都会在需要的时候在内部创建一个QWindow(即当第一次显示顶级小部件时),但是似乎没有办法指定应该从新窗口请求的Surface。
因此,我以与你类似的方式解决了这个问题。我有一个QStackWidget,我可以插入一个(否则毫无意义的)QOpenGLWidget。
stack->addWidget( new QOpenGLWidget() );
我没有像你一样在第一次显示后删除小部件,因为我知道我永远不会显示堆栈的特定条目,它永远不会绘制任何东西。因此,它在那里只是为了“投票”的表面需要从窗口。
这是有效的,但不得不用一个大脂肪黑客评论标签,叹息。

相关问题