Как использовать Qt и SDL вместе?
Я создаю механизм моделирования и редактор физики в Windows. Я хочу создать часть редактора с помощью Qt, и я хочу запустить движок с помощью SDL с OpenGL.
Моя первая идея заключалась в том, чтобы создать редактор, используя только Qt и разделить столько кода с движком (менеджер ресурсов, рендеринг, математика). Но я также хотел бы иметь возможность запускать симуляцию внутри редактора. Это означает, что мне также нужно поделиться имитационным кодом, который использует потоки SDL.
Итак, мой вопрос таков: есть ли способ визуализации OpenGL в Qt-окне с помощью SDL?
Я читал в Интернете, что возможно предоставить SDL с помощью дескриптора окна, в котором будет отображаться. У кого-нибудь есть опыт, что?
Кроме того, потоковая часть симулятора может создать проблему, поскольку она использует потоки SDL.
Ответы
Ответ 1
Пока вы можете заставить его работать, как первый ответ, вы, вероятно, столкнетесь с проблемами из-за потоковой передачи. Нет простых решений, когда дело доходит до потоковой передачи, и здесь вы будете взаимодействовать с SDL Qt и OpenGL mainloop. Не весело.
Самое простое и надежное решение - разделить обе части. Чтобы SDL и Qt выполнялись в отдельных процессах и чтобы они использовали какой-то обмен сообщениями (я бы рекомендовал d-bus здесь). Вы можете иметь SDL-рендеринг в окне без полей, и ваш редактор отправляет команды через сообщения.
Ответ 2
Это упрощение того, что я делаю в своем проекте. Вы можете использовать его так же, как обычный виджет, но по мере необходимости вы можете использовать его объект m_Screen для рисования на поверхности SDL, и он будет отображаться в виджетах:)
#include "SDL.h"
#include <QWidget>
class SDLVideo : public QWidget {
Q_OBJECT
public:
SDLVideo(QWidget *parent = 0, Qt::WindowFlags f = 0) : QWidget(parent, f), m_Screen(0){
setAttribute(Qt::WA_PaintOnScreen);
setUpdatesEnabled(false);
// Set the new video mode with the new window size
char variable[64];
snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
putenv(variable);
SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
// initialize default Video
if((SDL_Init(SDL_INIT_VIDEO) == -1)) {
std:cerr << "Could not initialize SDL: " << SDL_GetError() << std::endl;
}
m_Screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (m_Screen == 0) {
std::cerr << "Couldn't set video mode: " << SDL_GetError() << std::endl;
}
}
virtual ~SDLVideo() {
if(SDL_WasInit(SDL_INIT_VIDEO) != 0) {
SDL_QuitSubSystem(SDL_INIT_VIDEO);
m_Screen = 0;
}
}
private:
SDL_Surface *m_Screen;
};
Надеюсь, что это поможет
Примечание. Обычно имеет смысл установить минимальный и максимальный размер этого виджета на размер поверхности SDL.
Ответ 3
Рендеринг на opengl из QT тривиален (и работает очень хорошо)
Нет прямого опыта работы с SDL, но здесь есть пример приложения их смешивания.
http://www.devolution.com/pipermail/sdl/2003-January/051805.html
Существует хорошая статья о смешении виджета QT непосредственно с opengl здесь
http://doc.trolltech.com/qq/qq26-openglcanvas.html немного дальше того, что вам нужно, но скорее умного!
Ответ 4
вы можете использовать эту библиотеку (см. демонстрационный каталог):
https://github.com/kronat/libqsdl
Хороший день