• 9338阅读
  • 3回复

[提问]qt+ogre,widget鼠标消息响应问题请教 [复制链接]

上一主题 下一主题
离线louisir
 
只看楼主 倒序阅读 楼主  发表于: 2012-03-12
用的是网上找的一个ogrewidget类,继承自qwidget
FOgerWidget.h
  1. class FOgreWidget : public QWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     FOgreWidget(QWidget* parent = NULL, QString strInsName = "ogrehead");
  6.     ~FOgreWidget();
  7. protected:
  8.     // 事件处理函数
  9.     virtual void resizeEvent(QResizeEvent* evt);//窗口可能缩放
  10.     virtual void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口
  11.     virtual void paintEvent(QPaintEvent* evt);//呵,当然得处理了
  12.     virtual void keyPressEvent(QKeyEvent* evt);
  13.     virtual void keyReleaseEvent(QKeyEvent *e);
  14.     virtual void mousePressEvent(QMouseEvent* evt);
  15.     virtual void wheelEvent(QWheelEvent* evt);
  16.     
  17.     bool LoadPlugin();
  18.     bool LoadResource();
  19.     bool CreateSceneManager();
  20.     bool CreateRenderWindow();
  21.     bool CreateDefaultCamera();
  22.     bool SelectRenderSystem();
  23.     bool CreateScene();
  24.     void updateDraw();
  25.     void CreateLight();
  26.     std::string GetAppDirectory();
  27.     void SetModeColor(DWORD vColor);
  28.     Ogre::SceneManager*    m_pSceneManager;
  29.     Ogre::RenderWindow*    m_pRenderWindow;
  30.     Ogre::Camera*        m_pDefCamera;
  31.     Ogre::Viewport*        m_pDefViewport;  
  32.     Ogre::Root*            m_pRoot;
  33.     Ogre::Entity*        m_pMainEnt;
  34.     Ogre::SceneNode*    m_pMainNode;
  35.     Ogre::Light*        m_pMainLight;  
  36. public :
  37.     bool Initialize() ;
  38. private:
  39.     QString  m_strInsName_;    
  40. };

FOgreWidget.cpp
  1. FOgreWidget::FOgreWidget(QWidget* parent, QString strInsName)
  2.     : QWidget(parent,Qt::WFlags(Qt::MSWindowsOwnDC | Qt::Widget)),
  3.     m_strInsName_(strInsName)
  4. {
  5.     m_pSceneManager        =    NULL;
  6.     m_pRenderWindow        =    NULL;
  7.     m_pDefCamera        =    NULL;
  8.     m_pDefViewport        =    NULL;
  9.     m_pRoot                =    NULL;
  10.     m_pMainEnt            =    NULL;
  11.     m_pMainNode            =    NULL;
  12.     m_pMainLight        =    NULL;
  13. }
  14. FOgreWidget::~FOgreWidget()
  15. {
  16.     // destroy Viewport and RenderWindow
  17.     if(m_pDefViewport)
  18.     {
  19.         m_pRenderWindow->removeViewport(m_pDefViewport->getZOrder());
  20.         m_pDefViewport = NULL;
  21.     }
  22.     if(m_pRenderWindow)
  23.     {
  24.         Ogre::Root::getSingleton().detachRenderTarget(m_pRenderWindow);
  25.         m_pRenderWindow = NULL;
  26.     }    
  27. }
  28. void FOgreWidget::paintEvent(QPaintEvent *evt)
  29. {
  30.     Q_UNUSED(evt);  
  31.     updateDraw();
  32. }
  33. void FOgreWidget::timerEvent(QTimerEvent* evt)
  34. {
  35.     Q_UNUSED(evt);
  36.     updateDraw();
  37. }
  38. void FOgreWidget::resizeEvent(QResizeEvent *evt)
  39. {
  40.     QWidget::resizeEvent(evt);
  41. }
  42. void FOgreWidget::keyReleaseEvent(QKeyEvent *e)
  43. {
  44.     Ogre::Vector3 v = m_pDefCamera->getDirection();
  45.     v.normalise();
  46.     v *=2;
  47.     m_pDefCamera->moveRelative(v);
  48. }
  49. void FOgreWidget::keyPressEvent(QKeyEvent* evt)
  50. {
  51.     QWidget::keyPressEvent(evt);
  52.     Ogre::Vector3 v = m_pDefCamera->getDirection();
  53.     v.normalise();
  54.     v *=2;
  55.     m_pDefCamera->moveRelative(v);
  56. }
  57. void FOgreWidget::mousePressEvent(QMouseEvent* evt)
  58. {
  59.     QWidget::mousePressEvent(evt);
  60. }
  61. void FOgreWidget::wheelEvent(QWheelEvent* evt)
  62. {
  63.     QWidget::wheelEvent(evt);
  64. }
  65. bool FOgreWidget::LoadPlugin()
  66. {  
  67.     assert(m_pRoot!=NULL);
  68. #if defined(_DEGUG) || defined(DEBUG)
  69.     // Load D3D9 Render System(debug)
  70.     m_pRoot->loadPlugin("RenderSystem_Direct3D9_d");
  71.     // Load OpenGL Render System(debug)
  72.     m_pRoot->loadPlugin("RenderSystem_GL_d");
  73.     // Load partical system(debug)
  74.     m_pRoot->loadPlugin("Plugin_ParticleFX_d");
  75.     // Load octree
  76.     m_pRoot->loadPlugin("Plugin_OctreeSceneManager_d");
  77. #else
  78.     // Load D3D9 Render System
  79.     m_pRoot->loadPlugin("RenderSystem_Direct3D9");
  80.     // Load OpenGL Render System
  81.     m_pRoot->loadPlugin("RenderSystem_GL");
  82.     // Load partical system
  83.     m_pRoot->loadPlugin("Plugin_ParticleFX");
  84.     // Load octree
  85.     m_pRoot->loadPlugin("Plugin_OctreeSceneManager");
  86. #endif  
  87.     return true;
  88. }
  89. std::string FOgreWidget::GetAppDirectory()
  90. {
  91.     return QApplication::applicationDirPath().toStdString() + "/";
  92. }
  93. bool FOgreWidget::LoadResource()
  94. {
  95.     // Load resource paths from config file
  96.     Ogre::ConfigFile cf;
  97.     cf.load(GetAppDirectory() + "resources.cfg");
  98.     // Go through all sections & settings in the file
  99.     Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
  100.     Ogre::String secName, typeName, archName;
  101.     
  102.     while(seci.hasMoreElements())
  103.     {
  104.         secName = seci.peekNextKey();
  105.         Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
  106.         Ogre::ConfigFile::SettingsMultiMap::iterator i;
  107.         for(i = settings->begin(); i != settings->end(); ++i)
  108.         {
  109.             typeName = i->first;
  110.             if (i->second.find(":") == -1)
  111.                 archName = GetAppDirectory() + i->second;
  112.             else
  113.                 archName = i->second;
  114.             
  115.             
  116.             Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
  117.         }
  118.     }
  119.     return true;
  120. }
  121. bool FOgreWidget::CreateSceneManager()
  122. {
  123.     assert(m_pRoot);
  124.     m_pSceneManager = m_pRoot->createSceneManager(Ogre::ST_GENERIC);
  125.     return true;
  126. }
  127. bool FOgreWidget::CreateDefaultCamera()
  128. {
  129.     assert(m_pRoot);
  130.     assert(m_pSceneManager);
  131.     assert(m_pRenderWindow);
  132.     //m_pDefCamera = m_pSceneManager->createCamera(strName);
  133.     m_pDefCamera = m_pSceneManager->createCamera("MyCamera");
  134.     m_pDefCamera->setPosition(Ogre::Vector3(12, 8, 2));
  135.     m_pDefCamera->lookAt(Ogre::Vector3(6, 7, 0));
  136.     m_pDefCamera->setNearClipDistance(1);
  137.     m_pDefViewport = m_pRenderWindow->addViewport(m_pDefCamera);
  138.     m_pDefViewport->setBackgroundColour(Ogre::ColourValue(0, 0.0, 0.0, 1));
  139.     m_pDefCamera->setAspectRatio(Ogre::Real(m_pDefViewport->getActualWidth()) / Ogre::Real(m_pDefViewport->getActualHeight()));
  140.     // Make window active and post an update
  141.     m_pRenderWindow->setActive(true);
  142.     m_pRenderWindow->update();
  143.     return true;
  144. }
  145. // Create Render Window
  146. bool FOgreWidget::CreateRenderWindow()
  147. {
  148.     assert(m_pRoot);
  149.     Ogre::NameValuePairList params;
  150.     params["left"]                 = "0";
  151.     params["top"]                  = "0";
  152.     params["border"]               = "none";
  153.     //params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
  154.     params["parentWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
  155.     string strName;
  156.     strName = m_strInsName_.toStdString();
  157.     strName += "_Window";
  158.     m_pRenderWindow = m_pRoot->createRenderWindow(strName, width(), height(), false, &params);
  159.     if(NULL == m_pRenderWindow)
  160.         return false;
  161.     return true;
  162. }
  163. bool FOgreWidget::Initialize( )
  164. {
  165.     // already inited
  166.     if(m_pRoot != NULL)
  167.         return true;
  168.     if(NULL == Ogre::Root::getSingletonPtr())
  169.     {
  170.         // create scene root with no config file and plugin
  171.         //m_pRoot = new Root("");
  172.         m_pRoot = new Ogre::Root(GetAppDirectory() +  "plugins.cfg",
  173.             GetAppDirectory() + "ogre.cfg",
  174.             GetAppDirectory() + "Ogrelog.cfg");
  175.         // Load plugin
  176.         //FALSE_RETURN( LoadPlugin(), false );
  177.         // Select Render System
  178.         FALSE_RETURN(SelectRenderSystem(), false);
  179.         m_pRoot->initialise(false);
  180.         // Load Resource
  181.         FALSE_RETURN(LoadResource(), false);
  182.     }      
  183.     else
  184.     {
  185.         m_pRoot = Ogre::Root::getSingletonPtr();
  186.     }  
  187.     // Create Render Window
  188.     FALSE_RETURN(CreateRenderWindow(), false);
  189.     // Create Scene Manager
  190.     FALSE_RETURN(CreateSceneManager(), false);
  191.     // Create Default Camera and Viewport
  192.     FALSE_RETURN(CreateDefaultCamera(), false);
  193.     Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
  194.     // Create Scene
  195.     FALSE_RETURN(CreateScene(), false);
  196.     CreateLight();
  197.     startTimer(2);
  198.     return false;
  199. }  
  200. // Select Render System
  201. bool FOgreWidget::SelectRenderSystem()
  202. {
  203.     m_pRoot->restoreConfig();
  204. //     if(m_pRoot->showConfigDialog())
  205. //         return true;
  206. //     else
  207. //         exit(0);
  208.     return true;
  209. }
  210. bool FOgreWidget::CreateScene()
  211. {
  212.     Ogre::MaterialPtr r
  213.         = Ogre::MaterialManager::getSingleton().create("r",
  214.         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
  215.     r->setReceiveShadows(false);
  216.     r->getTechnique(0)->setLightingEnabled(true);
  217.     Ogre::Pass* rPass = r->getTechnique(0)->getPass(0);
  218.     rPass->setAmbient(1.0, 1.0, 1.0);
  219.     rPass->setDiffuse(1.0, 0.0, 0.0, 1.0);    // 如果需要透明则将alpha值设置成小于1.0即可
  220.     rPass->setSpecular(1.0, 0.0, 0.0, 1.0);
  221.     m_pSceneManager->setSkyBox(true, "Examples/StormySkyBox");  // add a skybox
  222. //     string strName;
  223. //     strName = m_strInsName_.toStdString();
  224. //     strName += ".mesh";
  225. //    m_pMainEnt = m_pSceneManager->createEntity("root_mesh", "a1.mesh");
  226. //    m_pMainEnt = m_pSceneManager->createEntity("root_mesh", "Object03.mesh");
  227. //     m_pMainNode = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
  228. //     Ogre::MaterialPtr a1
  229. //         = Ogre::MaterialManager::getSingleton().load("a1.material",
  230. //         Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
  231. //     //m_pMainEnt->setMaterial(a1);
  232. //     m_pMainNode->attachObject(m_pMainEnt);
  233. //
  234. //     Ogre::Entity* ent = m_pSceneManager->createEntity("Plane", Ogre::SceneManager::PT_PLANE);
  235. //     ent->setMaterialName("Examples/Frost");
  236. //     Ogre::SceneNode* node = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
  237. //     node->setPosition(0, 0, 50);
  238. //     node->attachObject(ent);
  239. //     DWORD vColor = 0;
  240. //     SetModeColor(vColor);
  241.     return true;
  242. }
  243. void FOgreWidget::updateDraw()
  244. {
  245.     if(m_pRenderWindow != NULL)
  246.     {
  247.         //printf("I'm %s/n",m_strInsName_.toStdString().c_str());
  248.         m_pRoot->_fireFrameStarted();
  249.         m_pRenderWindow->update();
  250. //         m_pDefCamera->yaw(Ogre::Radian(angleX));
  251. //         m_pDefCamera->pitch(Ogre::Radian(angleY));
  252.         m_pRoot->_fireFrameEnded();
  253.     }
  254. }
  255. void FOgreWidget::CreateLight()
  256. {
  257.     m_pSceneManager->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
  258.     m_pMainLight = m_pSceneManager->createLight("mainLight");
  259.     m_pMainLight->setPosition(20, 80, 50);
  260. }
  261. void FOgreWidget::SetModeColor(DWORD vColor)
  262. {
  263.     if(m_pMainEnt)
  264.     {
  265.         Ogre::MeshPtr  tpMesh = m_pMainEnt->getMesh();
  266.         tpMesh->setVertexBufferPolicy(Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY,true);
  267.         //遍历对应的模型
  268.         int  tSubEngityNum = tpMesh->getNumSubMeshes();
  269.         for(int S = 0 ; S < tSubEngityNum ; S++)
  270.         {
  271.             //
  272.             Ogre::SubMesh* tpSubMesh = tpMesh->getSubMesh(S);
  273.             //锁定顶点缓冲区
  274.             Ogre::VertexData* tVertexData = tpSubMesh->vertexData;
  275.             //色彩
  276.         //    size_t tSize3 = 0;
  277.         //    size_t  tOffSet3 = 0;
  278.             const Ogre::VertexElement* posElem3 =
  279.                 tVertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_DIFFUSE);
  280.             
  281.             Ogre::VertexDeclaration::VertexElementList lst
  282.                 = tVertexData->vertexDeclaration->getElements();
  283.             
  284.             for (Ogre::VertexDeclaration::VertexElementList::iterator it = lst.begin();
  285.                 it != lst.end(); it++)
  286.             {
  287.                 Ogre::VertexElement& el = (*it);
  288.                 if (el.getType() == Ogre::VET_COLOUR_ARGB)
  289.                 {
  290.                     Ogre::HardwareVertexBufferSharedPtr dstHVBPos = tVertexData->vertexBufferBinding->getBuffer(posElem3->getSource());
  291.                     size_t SizeInBytes  = dstHVBPos->getSizeInBytes();
  292.                     size_t numVertices  = dstHVBPos->getNumVertices();
  293.                     size_t SizeVertices = dstHVBPos->getVertexSize();
  294.                     size_t VerticesCount= tVertexData->vertexCount;
  295.                     unsigned char* pVert = static_cast<unsigned char*>(dstHVBPos->lock(0,
  296.                         SizeInBytes ,
  297.                         Ogre::HardwareBuffer::HBL_NORMAL));
  298.                     float *dstDataPos ;
  299.                     //遍历所有顶点
  300.                     for(int i = 0 ; i < VerticesCount ; i++,  pVert += SizeVertices )
  301.                     {
  302.                         posElem3->baseVertexPointerToElement(pVert,&dstDataPos);
  303.                         Ogre::RGBA tColor  = dstDataPos[0];
  304.                         //为了验证色彩,我先取得一下查看
  305.                         BYTE tRed = tColor >>24;
  306.                         BYTE tGreen = (tColor >>16)&0xff;
  307.                         BYTE tBlue = (tColor >>8)&0xff;
  308.                         BYTE tAlpha  = tColor &0xff;
  309.                         DWORD tRed2 = 0;
  310.                         DWORD tGreen2 = 255;
  311.                         DWORD tBlue2 = 0;
  312.                         DWORD tAlpha2 = 0;
  313.                         DWORD tColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;
  314.                         dstDataPos[0] = tColor2;
  315.                     }
  316.                     dstHVBPos->unlock();
  317.                     break;
  318.                 }
  319.             }
  320.             if(posElem3)
  321.             {
  322.             //    tSize3 = posElem3->getSize();
  323.             //    tOffSet3 = posElem3->getOffset();
  324.             }
  325.             else
  326.             {
  327.                 //::MessageBox(NULL,"没有顶点色","提示",MB_OK);
  328.                 return;
  329.             }
  330.             Ogre::HardwareVertexBufferSharedPtr dstHVBPos = tVertexData->vertexBufferBinding->getBuffer(posElem3->getSource());
  331.             size_t SizeInBytes  = dstHVBPos->getSizeInBytes();
  332.             size_t numVertices  = dstHVBPos->getNumVertices();
  333.             size_t SizeVertices = dstHVBPos->getVertexSize();
  334.             size_t VerticesCount= tVertexData->vertexCount;
  335.             unsigned char* pVert = static_cast<unsigned char*>(dstHVBPos->lock(0, SizeInBytes ,
  336.                 Ogre::HardwareBuffer::HBL_NORMAL));
  337.             float *dstDataPos ;
  338.             //遍历所有顶点
  339.             for(int i = 0 ; i < VerticesCount ; i++,  pVert += SizeVertices )
  340.             {
  341.                 posElem3->baseVertexPointerToElement(pVert,&dstDataPos);
  342.                 Ogre::RGBA tColor  = dstDataPos[0];
  343.                 //为了验证色彩,我先取得一下查看
  344.                 BYTE tRed = tColor >>24;
  345.                 BYTE tGreen = (tColor >>16)&0xff;
  346.                 BYTE tBlue = (tColor >>8)&0xff;
  347.                 BYTE tAlpha  = tColor &0xff;
  348.                 DWORD tRed2 = 0;
  349.                 DWORD tGreen2 = 255;
  350.                 DWORD tBlue2 = 0;
  351.                 DWORD tAlpha2 = 255;
  352.                 DWORD tColor2 =(tRed2 << 24)|(tGreen2 << 16)|(tBlue2 << 8)|tAlpha2 ;
  353.                 dstDataPos[0] = tColor2;
  354.             }
  355.             dstHVBPos->unlock();
  356.         }
  357.     
  358.     }
  359. }


main中的代码
  1. QApplication a(argc, argv);
  2.     a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
  3.     QSize qSize = QApplication::desktop()->availableGeometry().size();
  4.     qSize.setHeight(qSize.height() - QT_TITLE_BAR_HEIGHT);
  5.     
  6.     QMainWindow mainwindow;
  7.     QGridLayout layout;
  8.     FOgreWidget ogrewidget(&mainwindow);
  9.     ogrewidget.Initialize();
  10.     layout.addWidget(&ogrewidget, 0, 0, 1, 1);
  11.     mainwindow.setLayout(&layout);
  12.     mainwindow.show();

运行时,FOgreWidget无法响应到mousePressEvent和KeyPressEvent,希望能获得您的帮助,谢谢
离线jdwx

只看该作者 1楼 发表于: 2012-03-12
void FOgreWidget::mousePressEvent(QMouseEvent* evt)
{
    QWidget::mousePressEvent(evt);
}
上面的是mousePressEvent,如此 写法等于没有写任何代码。
还有怎么看都有MFC的影子。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线louisir
只看该作者 2楼 发表于: 2012-03-12
引用第1楼jdwx于2012-03-12 10:31发表的  :
void FOgreWidget::mousePressEvent(QMouseEvent* evt)
{
    QWidget::mousePressEvent(evt);
}
上面的是mousePressEvent,如此 写法等于没有写任何代码。
.......


应该如何做呢?
离线张羽
只看该作者 3楼 发表于: 2012-04-26
在此类的构造函数里调用
setMouseTracking(true);
使鼠标消息生效.
快速回复
限100 字节
 
上一个 下一个