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. 执行结果
可以使用Qt控件连接自定义槽控制SDL进行渲染