在Qt上使用SDL2绘制QWidget

// 方案主要是绘图部分使用 SDL 进行绘制,窗口部分使用 Qt ...
// 该案例中还有很多需要优化的部分 ... 
// 比如:SDL_CreateRenderer 不需要反复创建 ...
// 比如:不需要 SDL_CreateTextureFromSurface 反复装转到纹理
// 比如:不需要反复释放 Renderer 和 Texture ...
// 但是该 SDL 与 Qt 结合的方案还是有很多可借鉴的地方 ...
通过SDL2的SDL_CreateWindowFrom函数将QWidget转换为SDL_Window

    SDL_Window *window = SDL_CreateWindowFrom((void*)this->winId())

Qt只能在QWidget的paintEvent事件里进行绘图

    virtual void QWidget::paintEvent(QPaintEvent* event);
#ifndef SDL2WIDGET_H
#define SDL2WIDGET_H

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <QWidget>
#include <QPaintEvent>

class SDL2Widget : public QWidget
{
    Q_OBJECT
public:
    SDL2Widget(QWidget* parent=0);
    ~SDL2Widget();
protected:
    void paintEvent(QPaintEvent* event);

private:   
    SDL_Window *window;
    SDL_Renderer *render;
    SDL_Surface *surface;
    SDL_Texture *texture;
};


#endif

#include <SDL2Widget.h>

SDL2Widget::SDL2Widget(QWidget* parent):QWidget(parent)
{
    /* SDL2初始化 */
    SDL_Init(SDL_INIT_EVERYTHING);
    /* 把QWidget转换为SDL_Window */
    window = SDL_CreateWindowFrom((void*)this->winId());
    /* SDL2 Image初始化 */
    IMG_Init(IMG_INIT_PNG);
    /* 加载图片,创建surface */
    surface = IMG_Load("demo.jpg");
}

SDL2Widget::~SDL2Widget()
{

}

/* 绘图操作必须在paintEvent事件里进行 */
void SDL2Widget::paintEvent(QPaintEvent* event)
{
    /* 在window上创建一个render */
    render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED 
            | SDL_RENDERER_PRESENTVSYNC);
    /* 创建一个texture */
    texture = SDL_CreateTextureFromSurface(render, surface);
    /* 清空render的内容 */
    SDL_RenderClear(render);
    /* 将texture复制到render上 */
    SDL_RenderCopy(render, texture, NULL, NULL);
    /* 将render显示到window上 */
    SDL_RenderPresent(render);
    /* 销毁render和texture,释放内存 */
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
}

#include <QApplication>
#include <SDL2Widget.h>
#include <QLayout>
#include <QPushButton>

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    QVBoxLayout* layout = new QVBoxLayout;
    SDL2Widget* sdlWidget = new SDL2Widget;
    QPushButton* button = new QPushButton("Button");
    layout->addWidget(sdlWidget);
    layout->addWidget(button);
    QWidget w;
    w.setLayout(layout);
    w.show();
    w.resize(640,400);
    QObject::connect(button,&QPushButton::clicked,
    sdlWidget,(void(SDL2Widget::*)(void))&SDL2Widget::repaint);
    return app.exec();
}
摘自:www.kurukurumi.com 感谢 !!!