Linux 环境 SDL2 渲染 Qt5 Widget 简单代码

这篇博客介绍了如何在Linux Ubuntu 21.04环境下,利用Qt5的QWidget类结合SDL2库实现图形渲染。通过创建自定义的SdlWidget类,实现了在Qt窗口中显示由SDL渲染的红色方块。关键步骤包括初始化SDL,创建SDL窗口和渲染器,并通过Qt定时器驱动SDL渲染。最终,通过执行代码,成功地在Qt应用中显示了SDL渲染的内容。
摘要由CSDN通过智能技术生成

SDL2 渲染 Qt5 Widget 简单代码

1. 环境

  • Linux Ubuntu 21.04
  • Qt 5.15.2
  • SDL 2.0.0

2.参考链接

1.这个比较规范但是没执行SDL_ShowWindow,在我的环境SDL无法渲染
https://toffee.neocities.org/posts/sdlgui-qt/?_360safeparam=4809359
2.这位指出要执行SDL_ShowWindow,黑屏是因为winId是变化的导致的,一下解决我的问题,这里感谢
http://t.csdn.cn/kQKg8

3. 代码

代码为了简单不太规范,没写释放和错误处理
目录结构如下:

.
├── CMakeLists.txt
├── main.cpp
└── sdlwidget.hpp
  • main.cpp
#include "sdlwidget.hpp"
#include <QApplication>
#include <QMainWindow>
// SDL会重定义main函数,如果链接有问题可以试试
// #undef main
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    SdlWidget *widget = new SdlWidget();
    widget->resize(640, 480);
    widget->sdlInit();
    // widget->show(); // 已经通过SDL_ShowWindow显示窗口,这里不用执行
    return app.exec();
}
  • sdlwidget.hpp
#include <QWidget>
#include <SDL2/SDL.h>
class SdlWidget : public QWidget {
  public:
    SdlWidget(QWidget *parent = 0) : QWidget(parent) {
        // 链接的教程中设置了如下属性,但我没设置也正常,如果出现画面闪烁可以试试
        // setUpdatesEnabled(false);
        // setAttribute(Qt::WA_OpaquePaintEvent);
        // setAttribute(Qt::WA_NoSystemBackground);
        // setFocusPolicy(Qt::StrongFocus);
        // setAttribute(Qt::WA_PaintOnScreen);
    }
    void sdlInit() {
        SDL_Init(SDL_INIT_VIDEO);
        sdlWin = SDL_CreateWindowFrom(reinterpret_cast<void *>(winId()));
        renderer = SDL_CreateRenderer(sdlWin, -1, SDL_RENDERER_ACCELERATED);
        startTimer(1000 / 60); // 60帧,因为主线程要执行app.exec(), 所以SDL的渲染通过Qt定时器执行,或者自己开个线程
        SDL_ShowWindow(sdlWin);
    }

  private:
    // 覆盖QObject的定时器处理函数
    void timerEvent(QTimerEvent *event) override {
    	// 白色背景
        SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
        SDL_RenderClear(renderer);
        // 红色方块
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
        SDL_RenderFillRect(renderer, new SDL_Rect({0, 0, 100, 100}));
        SDL_RenderPresent(renderer);
    }
    SDL_Window *sdlWin;
    SDL_Renderer *renderer;
};
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(qtsdl LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
if (CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main Qt::Widgets SDL2)

4. 编译执行

cmake -B build
cmake --build build
./build/main

5. 执行结果

![在这里插入图片描述](https://img-blog.csdnimg.cn/6e355126bb1c42219060897e2af93e92.png
可以使用Qt控件连接自定义槽控制SDL进行渲染

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值