qt工程中调用sdl的流程

配置 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();
}
相关推荐
一叶之秋141212 小时前
QT背景介绍与环境搭建
开发语言·qt
QT 小鲜肉13 小时前
【QT/C++】Qt网络编程进阶:UDP通信和HTTP请求的基本原理和实际应用(超详细)
c语言·网络·c++·笔记·qt·http·udp
四维碎片16 小时前
【Qt】大数据量表格刷新优化--只刷新可见区域
开发语言·qt
一叶之秋141217 小时前
Qt开发初识
开发语言·qt
梵尔纳多19 小时前
ffmpeg 使用滤镜实现播放倍速
c++·qt·ffmpeg
QT 小鲜肉1 天前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
Tony小周1 天前
使用QKeyEvent keyPress(QEvent::KeyPress, key模拟键盘发送事件,会导致主程序卡死
嵌入式硬件·qt
Larry_Yanan1 天前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
zhmhbest1 天前
Qt 全球峰会 2025:中国站速递 —— 技术中立,拥抱更大生态
开发语言·qt·系统架构
feiyangqingyun2 天前
Qt实时绘制飞行轨迹/移动轨迹实时显示/带旋转角度/平滑移动/效果一级棒/地面站软件开发/无人机管理平台
qt·无人机·集群地面站