在Qt 4.8中集成OGRE 1.7.3

4

我尝试将Ogre3d小部件嵌入Ubuntu上的Qt小部件中,但我们看到了黑屏。

当我们使用ogre::Root::RenderWindow而没有父窗口(作为主窗口)时,一切都正常。但当我们创建ogre::Root::RenderWindow作为其他主窗口的子窗口时,我们遇到了ogre无法工作的问题。

以下是代码:

cpp:http://pastebin.com/Rbxa5btj

header:http://pastebin.com/F4w5eQ7d

1个回答

0
我遇到了这个问题,我需要调用下面显示的XSync方法。这是OgreWidget::initialize方法的一部分,其中OgreWidgetQWidget的子类。在OgreWidget构造函数的一部分之后,会调用initialize方法,此时已经分配了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的“extras”组件中添加。新的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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接