最近看到osg Examples的osgQtBrowser例子, 觉得效果还是挺好的, 想加入到自己的项目中来, 就这样的搬运工作也出问题了-__-
拷过来的是这一段:
osg::ref_ptr<osgQt::QWebViewImage> image = new osgQt::QWebViewImage; if (arguments.argc()>1) image->navigateTo((arguments[1])); else image->navigateTo("http://www.baidu.com"); osgDB::writeImageFile(*image, "d:/1.bmp"); osgWidget::GeometryHints hints(osg::Vec3(0.0f,0.0f,0.0f), osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(0.0f,0.0f,1.0f), osg::Vec4(1.0f,1.0f,1.0f,1.0f), osgWidget::GeometryHints::RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO); osg::ref_ptr<osgWidget::Browser> browser = new osgWidget::Browser; browser->assign(image.get(), hints); // image->focusBrowser(true); osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(arguments); viewer->setSceneData(browser.get()); viewer->setCameraManipulator(new osgGA::TrackballManipulator()); viewer->addEventHandler(new osgViewer::StatsHandler); viewer->addEventHandler(new osgViewer::WindowSizeHandler);
代码在osgQtBrowser例子中跑的是好好的, 但在我这里就是显示不出来...
这是我这里的效果:
一大块白的....心想, 我靠, 这是玩我呢吧, 同样的代码, 例子行我不行0-0#
一顿对比代码, 终于在例子的最后发现了问题(一开始我从没怀疑过这个地方....)
if (useFrameLoopThread) { // create a thread to run the viewer's frame loop ViewerFrameThread viewerThread(viewer.get(), true); viewerThread.startThread(); // now start the standard Qt event loop, then exists when the viewerThead sends the QApplication::exit() signal. return QApplication::exec(); } else { // run the frame loop, interleaving Qt and the main OSG frame loop while(!viewer->done()) { // process Qt events - this handles both events and paints the browser image QCoreApplication::processEvents(QEventLoop::AllEvents, 100); viewer->frame(); } return 0; }
这一块代码在我的测试代码中是用 return viewer.run() 来代替的, 看了看英文的注释才知道我的问题在哪.
Qt自己有一套事件循环机制, osg也有, 所以在内嵌Qt控件的时候, 一定要注意把事件也传给qt一份, 否则的话, 控件是创建出来了, 但因为没有收到任何事件或是信号, 所以browser页面无法刷新出来.
改成例子中的代码后, 我的测试程序也能显示网页了.