2012-05-10 4 views
4

Я пытаюсь внедрить виджет ogre3d в виджет qt на Ubuntu, но мы видим черный экран.Интеграция OGRE 1.7.3 в Qt 4.8

Когда мы ogre :: Root :: RenderWindow используется без родительского виджета (в качестве главного окна), все работает. Но когда мы создаем ogre :: Root :: RenderWindow как дочернее окно другого главного окна, мы сталкиваемся с тем, что ogre не работает.

Вот код:

каст: http://pastebin.com/Rbxa5btj

Заголовок: http://pastebin.com/F4w5eQ7d

ответ

0

Я имел эту проблему, и мне нужно, чтобы вызвать метод XSync, как показано ниже. Это часть метода OgreWidget::initialize, где OgreWidget подклассы QWidget. initialize называется частью построения OgreWidget, после того, как выделено m_OgreRoot и система рендеринга установлена.

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); 

Это же код, измененный для Qt 5.1.0. QX11Info был удален для Qt 5.0.x, затем добавлен в компонент «Дополнительные компоненты» для Qt 5.1.0. Новый класс QX11Info имеет только статические методы.

#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); 
Смежные вопросы