Как мне использовать Qt и SDL вместе?
Вопрос
Я создаю движок физического моделирования и редактор в Windows.Я хочу создать редакторскую часть, используя Qt, и я хочу запустить движок, используя SDL с OpenGL.
Моей первой идеей было создать редактор, используя только Qt, и поделиться как можно большим количеством кода с движком (менеджером ресурсов, средством визуализации, математикой).Но я также хотел бы иметь возможность запускать симуляцию внутри редактора. Это означает, что я также должен поделиться кодом моделирования, который использует потоки SDL.
Итак, мой вопрос заключается в следующем:Есть ли способ отобразить OpenGL в окне Qt с помощью SDL?
Я читал в Интернете, что, возможно, можно было бы снабдить SDL дескриптором окна для рендеринга.У кого-нибудь есть опыт в этом?
Кроме того, потоковая часть симулятора может представлять проблему, поскольку она использует потоки SDL.
Решение
Хотя вы могли бы заставить его работать, как предполагает первый ответ, вы, скорее всего, столкнетесь с проблемами из-за многопоточности.Когда дело доходит до потоковой обработки, простых решений не существует, и здесь у вас будет взаимодействие SDL Qt и OpenGL mainloop.Не весело.
Самым простым и разумным решением было бы разделить обе части.Чтобы SDL и Qt запускались в отдельных процессах и чтобы они использовали какой-то вид обмена сообщениями для связи (здесь я бы рекомендовал d-bus ).Вы можете визуализировать SDL в окне без полей, и ваш редактор будет отправлять команды через сообщения.
Другие советы
Это упрощение того, что я делаю в своем проекте.Вы можете использовать его как обычный виджет, но по мере необходимости вы можете использовать его объект 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.
Рендеринг в opengl из QT тривиален (и работает очень хорошо). У меня нет прямого опыта работы с SDL, но здесь есть пример приложения о их смешивании.http://www.devolution.com/pipermail/sdl/2003-January/051805.html
Здесь есть хорошая статья о смешивании QT widgewts непосредственно с opengl http://doc.trolltech.com/qq/qq26-openglcanvas.html немного больше того, что вам строго необходимо, но довольно умно!
вы могли бы использовать эту библиотеку (см. демонстрационный каталог).:
https://github.com/kronat/libqsdl
Хорошего вам дня