创建Qt Widget窗口项目
配置项目头文件库文件
可以参考
ui设计器中添加一个lable
头文件添加定时器重载
#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);
}
效果
颜色会变化