通过 SDL 呈现 QtQuick GUI
Render QtQuick GUI over SDL
正在尝试将 QML 用户界面渲染到 SDL window。
有一款 SDL 1.2 游戏通过 SDL_SetVideoMode
和 SDL_OPENGLBLIT
标志创建 OpenGL 上下文。
我们的想法是获取 OpenGL 上下文句柄并将其传递给将在场景上绘制 GUI 的 QQuickRenderControl。
获取本机上下文(X11 示例):
GLXContext currentContext;
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if (SDL_GetWMInfo(&wmInfo))
{
Display *display = wmInfo.info.x11.gfxdisplay;
currentContext = glXGetCurrentContext();
assert(currentContext);
}
在 Qt 中采用它:
QOpenGLContext *ctx = new QOpenGLContext;
ctx->setNativeHandle(QVariant::fromValue<QGLXNativeContext>(
QGLXNativeContext(currentContext, wmInfo.info.x11.display, wmInfo.info.x11.window)
));
并创建 QQuickRenderControl:
QQuickRenderControl *renderControl = new QQuickRenderControl;
renderControl->initialize(ctx);
但是QQuickRenderControl没有QWindow就无法启动:
QQuickRenderControl::initialize called with no associated window
还有 ctx->isValid()
和 ctx->makeCurrent()
return 错误。
如何让它发挥作用?
至少 SDL2 是可能的。
Qt 应用程序单例必须运行,window 必须从本机句柄中提取并传递给 RenderControl。
正在尝试将 QML 用户界面渲染到 SDL window。
有一款 SDL 1.2 游戏通过 SDL_SetVideoMode
和 SDL_OPENGLBLIT
标志创建 OpenGL 上下文。
我们的想法是获取 OpenGL 上下文句柄并将其传递给将在场景上绘制 GUI 的 QQuickRenderControl。
获取本机上下文(X11 示例):
GLXContext currentContext;
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if (SDL_GetWMInfo(&wmInfo))
{
Display *display = wmInfo.info.x11.gfxdisplay;
currentContext = glXGetCurrentContext();
assert(currentContext);
}
在 Qt 中采用它:
QOpenGLContext *ctx = new QOpenGLContext;
ctx->setNativeHandle(QVariant::fromValue<QGLXNativeContext>(
QGLXNativeContext(currentContext, wmInfo.info.x11.display, wmInfo.info.x11.window)
));
并创建 QQuickRenderControl:
QQuickRenderControl *renderControl = new QQuickRenderControl;
renderControl->initialize(ctx);
但是QQuickRenderControl没有QWindow就无法启动:
QQuickRenderControl::initialize called with no associated window
还有 ctx->isValid()
和 ctx->makeCurrent()
return 错误。
如何让它发挥作用?
至少 SDL2 是可能的。
Qt 应用程序单例必须运行,window 必须从本机句柄中提取并传递给 RenderControl。