我的应用程序分为两个模块,一个是由Ogre驱动的游戏世界,另一个是使用QT实现的GUI模块。
在应用程序启动时,我只需创建一个QApplication实例和一个空白的QWindow,然后我将QWindow放入一个Widget。代码如下所示:
```
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, ¶ms);
}
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, ¶ms);
```
我的应用程序已崩溃,我甚至无法捕获异常。 (我是中国人,所以语言是中文...)进度条的内容是'Ogre2.exe已停止工作...... Windows正在发现问题' 我的系统是Windows 10,IDE是visual studio 2015.Ogre是1.8版本,Qt是5.7.0。选择的Ogre Render系统是OpenGL