目前我正在尝试在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);
}