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
时,它会导致应用程序崩溃。由于MainWindow
是QWidget
,我不能在ctor中使用windowHandle()
,因为尚未创建窗口对象。
1条答案
按热度按时间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() );
我没有像你一样在第一次显示后删除小部件,因为我知道我永远不会显示堆栈的特定条目,它永远不会绘制任何东西。因此,它在那里只是为了“投票”的表面需要从窗口。
这是有效的,但不得不用一个大脂肪黑客评论标签,叹息。