在Qt应用程序中嵌入SDL2 / SDL_GPU

时间:2018-03-10 04:25:54

标签: c++ qt c++11 c++14 sdl-2

目前我正在尝试在Qt窗口内绘制SDL2 / SDL_GPU帧(用于渲染绘图和图像)。我打算用这个为2d tile map编辑器创建一个视图端口。到目前为止,我一直在寻找并找不到有效的解决方案。目前,我的脏解决方案是我有一个单独的SDL窗口,渲染器总是在顶部绘制并固定到Qt窗口位置以伪造此效果。是否值得继续这样做?或者如何在Qt窗口中嵌入SDL的渲染器或SDL_GPU(任何一个)?

Q2: 此外,使用Qt和SDL时编译期间会发生错误。 “在qtmain.lib中定义了WinMain aleady”。我目前对此的解决方法(在下面的代码中)是否很好或者我还能做些什么来更好地解决这个问题?

这是我目前的工作解决方案......

Main.cpp的

#include "MainWindow.h"
#include <QtWidgets/QApplication>
#undef main         //Error happens with winmain if i dont have this

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setFixedSize(600, 480);
    w.show();


    return a.exec();
}

MainWindow.h

#pragma once
#include <QtWidgets/QMainWindow>
#include <qtimer.h>
#include <SDL.h>
#include "ui_MainWindow.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = Q_NULLPTR);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;
    SDL_Window * wnd;
    SDL_Renderer * r;

    Q_SLOT void update();
};

MainWindow.cpp

#include "MainWindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    SDL_Init(SDL_INIT_EVERYTHING);
    wnd = SDL_CreateWindow("", (this->x() + this->width() / 2) - 150, (this->y() + this->height() / 2) - 150, 300, 300, SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALWAYS_ON_TOP);
    r = SDL_CreateRenderer(wnd, -1, SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor(r, 255, 0, 0, 255);
    SDL_RenderFillRect(r, NULL);
    SDL_RenderPresent(r);

    auto timer = new QTimer(parent);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(0);
}

MainWindow::~MainWindow()
{
    SDL_DestroyRenderer(r);
    SDL_DestroyWindow(wnd);
    SDL_Quit();
}

Q_SLOT void MainWindow::update()
{
    SDL_SetWindowPosition(wnd, (this->x() + this->width() / 2) - 150, (this->y() + this->height() / 2) - 150);
}

0 个答案:

没有答案