كيف يمكنني استخدام Qt و SDL معا ؟
سؤال
أنا بناء على محاكاة الفيزياء المحرك محرر في ويندوز.أريد بناء المحرر جزء باستخدام 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;
};
ويساعد هذا الأمل
ملاحظة:فإنه عادة ما يكون من المنطقي أن تعيين كل min و max حجم هذه القطعة إلى 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
وقد لطيفة اليوم