在Ogre中指定Qt窗口时,CreateRenderWindow()崩溃了

时间:2016-07-04 16:23:51

标签: c++ qt opengl ogre

我的应用程序分为两个模块,一个是由Ogre驱动的游戏世界,另一个是使用QT实现的GUI模块。

在应用程序启动时,我只需创建一个QApplication实例和一个空白的QWindow,然后我将QWindow放入一个Wi​​dget。代码如下所示:

```

QApplication qapp(argc, argv);
// The class gameworld_widget is just a subclass of QWindow with no other content
ui::gameworld_widget *mainWnd = new ui::gameworld_widget;
QWidget mainWndContainer;
mainWndContainer.setObjectName("OGRE222");
mainWndContainer.resize(800, 600);
mainWndContainer.createWindowContainer(mainWnd);
mainWndContainer.show();

```

然后我创建另一个线程来在其他地方创建和初始化Ogre模块,最后我将'mainthread'控件传递给Qt。

```

// Get HWND of gameworld_widget in 'main thread'
auto hMainWnd = reinterpret_cast<HWND>(mainWnd->winId());
std::thread gameWorldThread([hMainWnd]() {
try {
game_world gameWorld(hMainWnd); // see below
}
catch (game_world_exception &ex) {
std::cout << "GameWorldException occurs\n";
return;
}
});
gameWorldThread.detach(); // detach Ogre thread
return qapp.exec(); // pass control to Qt

```

在Ogre模块中,我的代码如下所示:

```

Ogre::NameValuePairList params;
params["externalWindowHandle"] = Ogre::StringConverter::toString(reinterpret_cast<size_t>(hwnd));
Ogre::RenderWindow *mWindow;
try
{
mWindow = root.createRenderWindow("SampleBrowser", 800, 600, false, &params);
}
catch (Ogre::Exception ex)
{
std::cout << "Ogre exception occur:" << typeid(ex).name() << ex.what() << "\n";
throw game_world_exception();
}
catch (...)
{
throw game_world_exception(); // comment goes here
}

```

问题来了。运行时

```

/* comment goes here */
mWindow = root.createRenderWindow("SampleBrowser", 800, 600, false, &params);

```

我的应用程序已崩溃,我甚至无法捕获异常enter image description here (我是中国人,所以语言是中文...)进度条的内容是'Ogre2.exe已停止工作...... Windows正在发现问题' 我的系统是Windows 10,IDE是visual studio 2015.Ogre是1.8版本,Qt是5.7.0。选择的Ogre Render系统是OpenGL

1 个答案:

答案 0 :(得分:0)

Qt不允许任何GUI渲染出主线程。 确保这是你的问题。

请参阅:http://doc.qt.io/qt-5/thread-basics.html