配置 Qt 工程
在你的 Qt 工程中,需要对项目文件(.pro
文件)进行配置,以包含 SDL 库的路径和链接选项。
# Qt Project File (.pro)
# 设置 SDL 库的路径
INCLUDEPATH += /path/to/SDL/include
LIBS += -L/path/to/SDL/lib -lSDL2
初始化 SDL
在 Qt 的主函数中,确保 SDL 库的初始化在 Qt 的 QApplication 对象创建之前进行:
#include <QApplication>
#include <SDL.h>
int main(int argc, char *argv[])
{
// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
// SDL 初始化失败,处理错误
return -1;
}
// 创建 Qt 应用程序
QApplication app(argc, argv);
// 你的 Qt 代码
// 退出 SDL
SDL_Quit();
return app.exec();
}
调用 SDL
#include <QApplication>
#include <QWidget>
#include <SDL.h>
class SDLWidget : public QWidget
{
public:
SDLWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
qWarning("SDL_Init Error: %s", SDL_GetError());
return;
}
// 创建 SDL 窗口
sdlWindow = SDL_CreateWindowFrom((void*)this->winId());
if (!sdlWindow) {
qWarning("SDL_CreateWindowFrom Error: %s", SDL_GetError());
return;
}
// 创建 SDL 渲染器
sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED);
if (!sdlRenderer) {
qWarning("SDL_CreateRenderer Error: %s", SDL_GetError());
return;
}
// 渲染示例
SDL_SetRenderDrawColor(sdlRenderer, 255, 0, 0, 255);
SDL_RenderClear(sdlRenderer);
SDL_RenderPresent(sdlRenderer);
}
~SDLWidget() {
// 清理 SDL 资源
if (sdlRenderer) {
SDL_DestroyRenderer(sdlRenderer);
}
if (sdlWindow) {
SDL_DestroyWindow(sdlWindow);
}
SDL_Quit();
}
private:
SDL_Window* sdlWindow;
SDL_Renderer* sdlRenderer;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SDLWidget widget;
widget.show();
return app.exec();
}
处理 SDL 和 Qt 事件
SDL 和 Qt 的事件处理机制是分开的,需要处理两者之间的交互。例如,如果你在 SDL 中处理输入事件。
#include <QApplication>
#include <QWidget>
#include <SDL.h>
class SDLWidget : public QWidget
{
public:
SDLWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
qWarning("SDL_Init Error: %s", SDL_GetError());
return;
}
// 创建 SDL 窗口
sdlWindow = SDL_CreateWindowFrom((void*)this->winId());
if (!sdlWindow) {
qWarning("SDL_CreateWindowFrom Error: %s", SDL_GetError());
return;
}
// 创建 SDL 渲染器
sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED);
if (!sdlRenderer) {
qWarning("SDL_CreateRenderer Error: %s", SDL_GetError());
return;
}
}
~SDLWidget() {
if (sdlRenderer) {
SDL_DestroyRenderer(sdlRenderer);
}
if (sdlWindow) {
SDL_DestroyWindow(sdlWindow);
}
SDL_Quit();
}
protected:
void paintEvent(QPaintEvent *event) override {
// 在 Qt 的 paintEvent 中调用 SDL 渲染
SDL_SetRenderDrawColor(sdlRenderer, 0, 255, 0, 255);
SDL_RenderClear(sdlRenderer);
SDL_RenderPresent(sdlRenderer);
}
private:
SDL_Window* sdlWindow;
SDL_Renderer* sdlRenderer;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SDLWidget widget;
widget.show();
return app.exec();
}