我尝试将 ogre3d 小部件嵌入 Ubuntu 上的 qt 小部件,但我们看到黑屏。
当我们使用 ogre::Root::RenderWindow 而不使用父窗口小部件(作为主窗口)时,一切正常。但是当我们创建 ogre::Root::RenderWindow 作为其他主窗口的子窗口时,我们会遇到 ogre 无法工作。
这是代码:
cpp: http: //pastebin.com/Rbxa5btj
标题: http: //pastebin.com/F4w5eQ7d
我尝试将 ogre3d 小部件嵌入 Ubuntu 上的 qt 小部件,但我们看到黑屏。
当我们使用 ogre::Root::RenderWindow 而不使用父窗口小部件(作为主窗口)时,一切正常。但是当我们创建 ogre::Root::RenderWindow 作为其他主窗口的子窗口时,我们会遇到 ogre 无法工作。
这是代码:
cpp: http: //pastebin.com/Rbxa5btj
标题: http: //pastebin.com/F4w5eQ7d
我遇到了这个问题,我需要调用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, ¶ms);
这是为 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, ¶ms);