栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

SDL渲染RGB数据到Qt中的控件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SDL渲染RGB数据到Qt中的控件

用到的知识

 
SDL渲染RGB数据到Qt中的控件通过定时器刷新

SdlQtRGB.h

#pragma once

#include 
#include "ui_SdlQtRGB.h"

class SdlQtRGB : public QWidget
{
    Q_OBJECT

public:
    SdlQtRGB(QWidget *parent = Q_NULLPTR);
    ~SdlQtRGB();

private:
    Ui::SdlQtRGBClass ui;

    void timerEvent(QTimerEvent* evt) override;
};

SdlQtRGB.cpp

#include "SdlQtRGB.h"
#include "sdl/SDL.h"
#include 

#pragma comment(lib, "SDL2.lib")
using namespace std;

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

void SdlQtRGB::timerEvent(QTimerEvent* evt)
{
    SDL_Rect rect;
    static unsigned char tmp = 255;

    rect.x = 0;
    rect.y = 0;
    rect.w = sdl_width;
    rect.h = sdl_height;

    for (int i = 0; i < sdl_height; i++)
    {
        int b = i * sdl_width * pixel_size;

        for (int j = 0; j < sdl_width * pixel_size; j += pixel_size)
        {
            rgb[b + j] = 0;        // B
            rgb[b + j + 1] = tmp;  // G
            rgb[b + j + 2] = 0;    // R
            rgb[b + j + 3] = 0;    // A
        }
    }

    tmp--;

    SDL_RenderClear(sdl_render);
    SDL_UpdateTexture(sdl_texture, nullptr, rgb, sdl_width * pixel_size);
    SDL_RenderCopy(sdl_render, sdl_texture, nullptr, &rect);
    SDL_RenderPresent(sdl_render);
}

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

    // 初始化 SDL
    if (SDL_Init(SDL_INIT_VIDEO))
    {
        cout << SDL_GetError() << endl;
    }

    // 创建窗口
    sdl_win = SDL_CreateWindowFrom((void*)ui.label->winId());  // 通过 Qt 控件中的句柄来创建窗口

    if (!sdl_win)
    {
        cout << SDL_GetError() << endl;
    }

    // 创建渲染器
    sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);

    if (!sdl_render)
    {
        cout << SDL_GetError() << endl;
    }

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

    if (!sdl_texture)
    {
        cout << SDL_GetError() << endl;
    }

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

    startTimer(10);  // 每过10ms就会调用一次 timerEvent,1s大约有100帧的图像
}

SdlQtRGB::~SdlQtRGB()
{
    delete[] rgb;
}

每过10ms就进行一次图像的渲染。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779975.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号