Linux下QT开发的动态库界面弹出操作(SDL2)

需求:

操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序
难点:

调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的
思路:
1. 调用方缺QApplication::exec(),那么我们在接口后面加qApp->exec(),可不可以?理论上这种方式是能正常弹出界面,但是问题在于,qApp->exec()是阻塞的,就是说你的接口在窗口关闭前,都没有返回值,也不能调用其他接口。所以这个思路行不通
2. 开其他线程用于弹出界面,并在此线程后面加qApp->exec(),可不可以?不行,因为QApplication::exec()只能在主线程运行,否则会报错
3. 采用第三方库,来进行界面处理
最后采用第3种方案,采用SDL2处理界面

SDL2简介:
SDL( Simple DirectMedia Layer) 是一套开放源代码的跨平台多媒体开发库, 使用 C 语
言写成。 SDL 提供了数种控制图像、 声音、 输出入的函数, 让开发者只要用相同或是相似的
代码就可以开发出跨多个平台( Linux、 Windows、 Mac OS X 等) 的应用软件。

SDL2编译:
官网链接:https://www.linuxfromscratch.org/blfs/view/cvs/multimedia/sdl2.html
解压编译(可能部分操作需要管理员权限):

tar -xvf linux-share-dir/SDL2-2.0.12.tar.gz
mkdir build
./configure --prefix=$PWD/build
make
make install

头文件在include文件,只要为SDL.h,但是其余也需要
生成的库在build/lib/

使用案例(配合opencv读图显示):


#include 
#include 
#include 
#include 
#include "SDL.h"

using namespace std;

SDL_Renderer* g_pRenderer = 0;  //处理所有渲染
SDL_Texture* g_sdlTexture = 0;  //存放图像的描述信息
SDL_Window* g_pWindow;          //定义了一个SDL2窗口

int testSDL2()
{
    int ret = 0;

    cv::Mat g_cv_img_show = cv::imread("bestface.jpg");
//    imshow("image", g_cv_img_show);

    int width = g_cv_img_show.cols;
    int height = g_cv_img_show.rows;

    //初始化 SDL
    ret = SDL_Init(SDL_INIT_EVERYTHING);

    if(ret >= 0)
    {
        //创建窗口
        g_pWindow = SDL_CreateWindow(0, 0, 0,
                                         width, height,
                                         //SDL_WINDOW_UTILITY
                                         SDL_WINDOW_SKIP_TASKBAR
                                         //SDL_WINDOW_FOREIGN
                                         | SDL_WINDOW_ALWAYS_ON_TOP
                                         | SDL_WINDOW_BORDERLESS
                                         //SDL_WINDOW_FULLSCREEN_DESKTOP |
                                         //SDL_WINDOW_SHOWN /*| SDL_WINDOW_ALWAYS_ON_TOP| SDL_WINDOW_BORDERLESS*/
                                         //  | SDL_WINDOW_SKIP_TASKBAR /*| SDL_WINDOW_INPUT_GRABBED*/
                                         );

        if (g_pWindow == 0)
        {
            return -1;
        }

        //基于窗口创建渲染器
        g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, SDL_RENDERER_ACCELERATED);
        //创建纹理
        g_sdlTexture = SDL_CreateTexture(g_pRenderer, SDL_PIXELFORMAT_BGR24,
                                         SDL_TEXTUREACCESS_STREAMING, width, height);

        SDL_RenderClear(g_pRenderer);
        SDL_SetRenderDrawColor(g_pRenderer, 187, 159, 93, 255);
        SDL_UpdateTexture(g_sdlTexture, NULL, g_cv_img_show.data, g_cv_img_show.cols * 3);  //设置纹理的数据

        SDL_RenderCopy(g_pRenderer, g_sdlTexture, NULL, NULL);  //纹理复制给渲染器
        SDL_RenderPresent(g_pRenderer);   //显示

        /*
        //当你不用的时候要Destroy
        SDL_DestroyTexture(g_sdlTexture);
        g_sdlTexture = NULL;
        SDL_DestroyRenderer(g_pRenderer);
        g_pRenderer = NULL;
        SDL_DestroyWindow(g_pWindow);
        g_pWindow = NULL;
        // clean up SDL
        SDL_Quit();
        */
    }

}

你可能感兴趣的:(QT类,qt,开发语言,sdl2,linux)