SDL渲染图像到Qt界面

60 阅读1分钟

创建Qt Widget窗口项目

image.png

配置项目头文件库文件

可以参考

ui设计器中添加一个lable

image.png

头文件添加定时器重载

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_sdlqtrgb.h"

class SDLQtRGB : public QMainWindow
{
    Q_OBJECT

public:
    SDLQtRGB(QWidget *parent = nullptr);
    ~SDLQtRGB();

    // 重载定时器函数
    void timerEvent(QTimerEvent* event) override;

private:
    Ui::SDLQtRGBClass ui;
};

实现文件

#include "sdlqtrgb.h"
#include <sdl/SDL.h>

// 添加库

#pragma comment(lib, "SDL2.lib")

static SDL_Window* sdl_win = NULL;
static SDL_Renderer* sdl_render = NULL;
static SDL_Texture* sdl_texture = NULL;
static unsigned char* rgb = NULL;
static int sdl_width = 0;
static int sdl_height = 0;


SDLQtRGB::SDLQtRGB(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    sdl_width = ui.label->width();
    sdl_height = ui.label->height();

    // 初始化

    SDL_Init(SDL_INIT_VIDEO);

    // 创建窗口,
    // 传的参数为窗口句柄

    sdl_win = SDL_CreateWindowFrom((void *)ui.label->winId());

    // 创建渲染器
    // SDL_RENDERER_ACCELERATED参数表示硬件加速

    sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);

    // 创建材质
    sdl_texture = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, sdl_width, sdl_height);

    rgb = new unsigned char[sdl_width * sdl_height * 4];

    // 启动定时器,间隔10毫秒
    startTimer(10);
}

SDLQtRGB::~SDLQtRGB()
{}

void SDLQtRGB::timerEvent(QTimerEvent* event)
{
    static unsigned char tmp = 255;
    tmp--;  // 模拟颜色变化
    for (int j = 0; j < sdl_height; j++)
    {
        int b = j * sdl_width * 4;
        for (int i = 0; i < sdl_width * 4; i += 4)
        {
            rgb[b + i] = tmp;  //  R
            rgb[b + i + 1] = 0; // G
            rgb[b + i + 2] = 0;  // B
            rgb[b + i + 3] = 0; // A
        }
    }

    // 更新材质

    SDL_UpdateTexture(sdl_texture, NULL, rgb, sdl_width * 4);

    // 清理画面

    SDL_RenderClear(sdl_render);

    // 把材质拷贝到渲染器中

    SDL_Rect rect;  // 定义目标位置
    rect.x = 0;
    rect.y = 0;
    rect.w = sdl_width;
    rect.h = sdl_height;

    SDL_RenderCopy(sdl_render, sdl_texture, NULL, &rect);

    // 渲染

    SDL_RenderPresent(sdl_render);

}

效果

颜色会变化

image.png

image.png