2012-05-10 2 views
4

J'essaie d'intégrer le widget ogre3d dans le widget qt sur Ubuntu, mais nous voyons l'écran noir.Intégrer OGRE 1.7.3 dans Qt 4.8

Lorsque nous ogre :: Root :: RenderWindow est utilisé sans widget parent (comme une fenêtre principale) tout fonctionne. Mais quand nous créons ogre :: Root :: RenderWindow en tant que fenêtre enfant d'une autre fenêtre principale, nous constatons que ogre ne fonctionne pas.

Voici le code:

cpp: http://pastebin.com/Rbxa5btj

tête: http://pastebin.com/F4w5eQ7d

Répondre

0

J'ai eu ce problème, et je devais appeler la méthode XSync comme indiqué ci-dessous. Cela fait partie d'une méthode OgreWidget::initialize, où OgreWidget sous-classes QWidget. initialize est appelé dans le cadre de la construction de OgreWidget, après m_OgreRoot est alloué et le système de rendu est défini.

setAttribute(Qt::WA_PaintOnScreen, true); 
setAttribute(Qt::WA_NoSystemBackground, true); 

setFocusPolicy(Qt::StrongFocus); 

Ogre::String winHandle; 
QX11Info info = x11Info(); 
winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); 
winHandle += ":"; 
winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); 
winHandle += ":"; 
winHandle += Ogre::StringConverter::toString((unsigned long)(winId())); 

Ogre::NameValuePairList params; 
params["parentWindowHandle"] = winHandle; 
params["FSAA"] = Ogre::String("8"); 

int w = width(); 
int h = height(); 
// Need to call XSync or the window handles will be invalid. 
XSync(info.display(), False); 
m_OgreWindow = 
     m_OgreRoot->createRenderWindow("OgreWidget_RenderWindow", 
            qMax(w, 640), qMax(h, 480), false, &params); 

Voici le même code modifié pour Qt 5.1.0. QX11Info a été supprimé pour Qt 5.0.x, puis ajouté au composant "extras" pour Qt 5.1.0. La nouvelle classe QX11Info n'a que des méthodes statiques.

#include <QtX11Extras/QX11Info> 
... 
setAttribute(Qt::WA_PaintOnScreen, true); 
setAttribute(Qt::WA_NoSystemBackground, true); 

setFocusPolicy(Qt::StrongFocus); 

Ogre::String winHandle; 
winHandle = Ogre::StringConverter::toString((unsigned long)(QX11Info::display())); 
winHandle += ":"; 
winHandle += Ogre::StringConverter::toString((unsigned int)(QX11Info::appScreen())); 
winHandle += ":"; 
winHandle += Ogre::StringConverter::toString((unsigned long)(winId())); 

Ogre::NameValuePairList params; 
params["parentWindowHandle"] = winHandle; 
params["FSAA"] = Ogre::String("8"); 

int w = width(); 
int h = height(); 
// Need to call XSync or the window handles will be invalid. 
XSync(QX11Info::display(), False); 
m_OgreWindow = 
     m_OgreRoot->createRenderWindow("OgreWidget_RenderWindow", 
            qMax(w, 640), qMax(h, 480), false, &params); 
Questions connexes