QT开发中文网

sdl 渲染到QWidget ,怎么通过grab 获取截图 c++

要在SDL渲染到QWidget上并通过grab()函数获取截图,可以按照以下步骤进行:

  1. 初始化SDL,并设置窗口和渲染器。
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("My Window", 100, 100, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
  1. 将QWidget的native window ID传递给SDL窗口。
WId winId = widget->winId();
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
SDL_GetWindowWMInfo(window, &wmInfo);
#if defined(Q_OS_WIN)
    hwnd = (void *)wmInfo.info.win.window;
#elif defined(Q_OS_LINUX)
    hwnd = (void *)(quintptr)wmInfo.info.x11.window;
#endif
SDL_SetWindowHitTest(window, [](SDL_Window*, const SDL_Point*, void* data) -> SDL_HitTestResult {
    return SDL_HITTEST_DRAGGABLE;
}, nullptr);
wmInfo.info.qws.window = hwnd;
  1. 在QWidget的paintEvent中调用SDL_RenderPresent()将渲染内容呈现到QWidget上。
void MyWidget::paintEvent(QPaintEvent*)
{
    SDL_Rect rect = { 0, 0, 640, 480 };
    SDL_RenderClear(renderer);
    // Render your content here
    SDL_RenderPresent(renderer);

    QPainter painter(this);
    QPixmap pixmap = grab(rect);
    painter.drawPixmap(rect, pixmap);
}
  1. 最后,在程序退出时释放资源。
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();

注意:在QWidget的paintEvent中使用grab()函数获取截图时,需要确保SDL渲染已经完成并呈现到QWidget上。否则可能会截取到未完成的渲染内容。可以在OpenGL环境下使用glFinish()或glFlush()等函数来确保渲染完成。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=571

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?