要在SDL渲染到QWidget上并通过grab()函数获取截图,可以按照以下步骤进行:
- 初始化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);
- 将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;
- 在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);
}
- 最后,在程序退出时释放资源。
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
注意:在QWidget的paintEvent中使用grab()函数获取截图时,需要确保SDL渲染已经完成并呈现到QWidget上。否则可能会截取到未完成的渲染内容。可以在OpenGL环境下使用glFinish()或glFlush()等函数来确保渲染完成。