- 作者
- Rosen Diankov
Shows how to execute commands inside the viewer thread and cast viewer to a QMainWindow. Note that this relies on the qtcoin viewer being derived from qt4's QMainWindow class
Full Example Code:
#include <vector>
#include <cstring>
#include <sstream>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <QMainWindow>
using namespace OpenRAVE;
using namespace std;
{
BOOST_ASSERT(!!viewer);
penv->Add(viewer);
bool showgui = true;
viewer->main(showgui);
}
{
QMainWindow* wnd = dynamic_cast<QMainWindow*>(pviewer.get());
wnd->show();
}
else {
wnd->hide();
}
}
int main(
int argc,
char ** argv)
{
string scenefilename = "data/lab1.env.xml";
string viewername = "qtcoin";
int i = 1;
while(i < argc) {
if((strcmp(argv[i], "-h") == 0)||(strcmp(argv[i], "-?") == 0)||(strcmp(argv[i], "/?") == 0)||(strcmp(argv[i], "--help") == 0)||(strcmp(argv[i], "-help") == 0)) {
RAVELOG_INFO(
"orloadviewer [--num n] [--scene filename] viewername\n");
return 0;
}
else if( strcmp(argv[i], "--scene") == 0 ) {
scenefilename = argv[i+1];
i += 2;
}
else
break;
}
if( i < argc ) {
viewername = argv[i++];
}
boost::thread thviewer(boost::bind(
SetViewer,penv,viewername));
penv->Load(scenefilename);
while(!pregistration) {
if( !pregistration && !!penv->GetViewer() ) {
pregistration = penv->GetViewer()->RegisterViewerThreadCallback(boost::bind(
ViewerCallback,penv->GetViewer()));
}
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}
thviewer.join();
pregistration.reset();
penv->Destroy();
return 0;
}