Results 1 to 6 of 6

Thread: Integrating Ogre in QMdiArea !

  1. #1
    Join Date
    Jun 2010
    Posts
    34
    Qt products
    Qt4
    Platforms
    Windows

    Question Integrating Ogre in QMdiArea !

    Hello,

    I have a problem integrating Ogre in QtMdiArea (not with QWidget, it's work fine!).
    I'm pretty sure that the problem is Qt, because I have checked all the Ogre Code, and it's working with a simple QWidget.
    You can see I have derived OgreWidget from QMdiSubWindow instead of QWidget because it's working better than QWidget with QMdiArea. I will post the Visual Solution tomorrow if you want.

    Here is my source code :

    OgreApplication.h :
    #ifndef OGREAPPLICATION_H
    #define OGREAPPLICATION_H

    #include <QObject>
    #include <Ogre.h>

    class OgreWidget;

    class OgreApplication : public QObject
    {
    Q_OBJECT

    public:
    OgreApplication(QObject *parent = 0);
    ~OgreApplication();
    void setupNLoadResources();
    void createScene();

    public slots:
    void initialise();
    OgreWidget * createOgreWidget();

    private:
    Ogre::Root *ogreRoot;
    Ogre::SceneManager *ogreSceneManager;
    static int nbRenderWindows;
    };

    #endif // OGREAPPLICATION_H

    OgreApplication.cpp :
    #include "OgreApplication.h"

    #include "OgreWidget.h"

    int OgreApplication::nbRenderWindows = 0;

    OgreApplication::OgreApplication(QObject *parent)
    : QObject(parent),
    ogreRoot(0),
    ogreSceneManager(0)
    {

    }

    OgreApplication::~OgreApplication()
    {
    if(ogreRoot)
    {
    if(ogreSceneManager)
    {
    ogreRoot->destroySceneManager(ogreSceneManager);
    }
    }

    delete ogreRoot;
    }

    void OgreApplication::initialise()
    {
    if (ogreRoot == NULL)
    {
    ogreRoot = new Ogre::Root();
    }

    // initialised ?
    if (!ogreRoot->isInitialised())
    {
    Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
    ogreRoot->setRenderSystem(renderSystem);
    ogreRoot->initialise(false);
    // Verify initialisation after initialise root
    if (!ogreRoot->isInitialised())
    {
    return;
    }
    }
    else
    {
    return;
    }

    ogreSceneManager = ogreRoot->createSceneManager(Ogre::ST_GENERIC);
    }

    OgreWidget * OgreApplication::createOgreWidget()
    {
    nbRenderWindows++;
    OgreWidget * og = new OgreWidget();
    og->initialise(nbRenderWindows, ogreRoot, ogreSceneManager);

    if (nbRenderWindows == 1)
    {
    setupNLoadResources();
    createScene();
    }

    return og;
    }

    void OgreApplication::setupNLoadResources()
    {
    // Load resource paths from config file
    Ogre::ConfigFile cf;
    cf.load("resources.cfg");

    // Go through all sections & settings in the file
    Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();

    Ogre::String secName, typeName, archName;
    while (seci.hasMoreElements())
    {
    secName = seci.peekNextKey();
    Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    Ogre::ConfigFile::SettingsMultiMap::iterator i;
    for (i = settings->begin(); i != settings->end(); ++i)
    {
    typeName = i->first;
    archName = i->second;
    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    // OS X does not set the working directory relative to the app,
    // In order to make things portable on OS X we need to provide
    // the loading with it's own bundle path location
    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    Ogre::String(macBundlePath() + "/" + archName), typeName, secName);
    #else
    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    archName, typeName, secName);
    #endif
    }
    }

    // Initialise, parse scripts etc
    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
    }

    void OgreApplication::createScene()
    {
    ogreSceneManager->setAmbientLight(Ogre::ColourValue(1,1,1));

    Ogre::Entity *robotEntity = ogreSceneManager->createEntity("Robot", "robot.mesh");
    Ogre::SceneNode *robotNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode("RobotNode");
    robotNode->attachObject(robotEntity);
    robotNode->yaw(Ogre::Radian(Ogre::Degree(-90)));
    }

    OgreWidget.h :
    #ifndef OGREWIDGET_H
    #define OGREWIDGET_H

    #include <QtGui>
    #include <Ogre.h>

    class OgreWidget : public QMdiSubWindow, public Ogre::FrameListener
    {
    Q_OBJECT

    public:
    OgreWidget(QWidget *parent = 0);
    ~OgreWidget();
    void initialise(int renderWindowId, Ogre::Root * root, Ogre::SceneManager * sceneManager);
    virtual bool frameStarted(const Ogre::FrameEvent &evt);
    virtual bool frameEnded(const Ogre::FrameEvent &evt);
    void setCameraPosition(const Ogre::Vector3 &pos);

    virtual void showEvent(QShowEvent *e);
    virtual void paintEvent(QPaintEvent *e);
    virtual void moveEvent(QMoveEvent *e);
    virtual void resizeEvent(QResizeEvent *e);

    virtual void keyPressEvent(QKeyEvent *e);
    virtual void keyReleaseEvent(QKeyEvent *e);
    QPaintEngine * paintEngine() const;

    public slots:
    void setBackgroundColor(QColor c);

    signals:
    void cameraPositionChanged(const Ogre::Vector3 &pos);

    protected:

    private:
    bool mContinue;
    Ogre::RenderWindow *ogreRenderWindow;
    Ogre::Viewport *ogreViewport;
    Ogre::Camera *ogreCamera;
    Ogre::Root *ogreRoot;
    Ogre::SceneManager *ogreSceneManager;

    Ogre::Vector3 mDirection;
    };

    #endif OGREWIDGET_H

    OgreWidget.cpp :
    #include "OgreWidget.h"

    OgreWidget::OgreWidget(QWidget *parent) :
    QMdiSubWindow(parent),
    ogreRenderWindow(0),
    ogreViewport(0),
    ogreCamera(0),
    mContinue(true),
    mDirection(Ogre::Vector3::ZERO)
    {
    setAttribute(Qt::WA_NoSystemBackground);
    setAttribute(Qt::WA_NoBackground);
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_OpaquePaintEvent);
    setMinimumSize(160,120);
    setFocusPolicy(Qt::ClickFocus);
    }

    OgreWidget::~OgreWidget()
    {
    if (ogreRoot)
    {
    ogreRoot->detachRenderTarget(ogreRenderWindow);
    }

    if(ogreRenderWindow)
    {
    ogreRenderWindow->removeAllViewports();
    }
    }

    void OgreWidget::initialise(int renderWindowId, Ogre::Root * root, Ogre::SceneManager * sceneManager)
    {
    ogreRoot = root;
    ogreSceneManager = sceneManager;

    Ogre::NameValuePairList viewConfig;
    Ogre::String widgetHandle;
    #ifdef Q_WS_WIN
    widgetHandle = Ogre::StringConverter::toString((size_t)((HWND)winId()));
    #else
    QWidget *q_parent = dynamic_cast <QWidget *> (parent());
    QX11Info xInfo = x11Info();

    widgetHandle = Ogre::StringConverter::toString ((unsigned long)xInfo.display()) +
    ":" + Ogre::StringConverter::toString ((unsigned int)xInfo.screen()) +
    ":" + Ogre::StringConverter::toString ((unsigned long)q_parent->winId());
    #endif
    Ogre::String renderWindowIdStr = Ogre::StringConverter::toString(renderWindowId);

    viewConfig["externalWindowHandle"] = widgetHandle;
    ogreRenderWindow = ogreRoot->createRenderWindow("Ogre rendering window"+renderWindowIdStr,
    width(), height(), false, &viewConfig);

    ogreCamera = ogreSceneManager->createCamera("myCamera"+renderWindowIdStr);
    ogreCamera->setPosition(0, 50,150);
    ogreCamera->lookAt(0,50,0);

    ogreViewport = ogreRenderWindow->addViewport(ogreCamera);
    ogreViewport->setBackgroundColour(Ogre::ColourValue(1,0,0));
    ogreCamera->setAspectRatio(Ogre::Real(width()) / Ogre::Real(height()));

    ogreRoot->addFrameListener(this);
    }

    bool OgreWidget::frameStarted(const Ogre::FrameEvent& evt)
    {
    return mContinue;
    }

    bool OgreWidget::frameEnded(const Ogre::FrameEvent& evt)
    {
    return mContinue;
    }

    void OgreWidget::setBackgroundColor(QColor c)
    {
    if(ogreViewport)
    {
    Ogre::ColourValue ogreColour;
    ogreColour.setAsARGB(c.rgba());
    ogreViewport->setBackgroundColour(ogreColour);
    }
    update();
    }

    void OgreWidget::showEvent(QShowEvent *e)
    {
    QMdiSubWindow::showEvent(e);
    }

    void OgreWidget::paintEvent(QPaintEvent *e)
    {
    QMdiSubWindow::paintEvent(e);

    ogreRoot->_fireFrameStarted();
    ogreRenderWindow->update();
    ogreRoot->_fireFrameEnded();

    e->accept();
    }

    void OgreWidget::moveEvent(QMoveEvent *e)
    {
    QMdiSubWindow::moveEvent(e);

    if(e->isAccepted() && ogreRenderWindow)
    {
    ogreRenderWindow->windowMovedOrResized();
    }
    update();
    }

    void OgreWidget::resizeEvent(QResizeEvent *e)
    {
    QMdiSubWindow::resizeEvent(e);

    if(e->isAccepted())
    {
    const QSize &newSize = e->size();
    if(ogreRenderWindow)
    {
    ogreRenderWindow->resize(newSize.width(), newSize.height());
    ogreRenderWindow->windowMovedOrResized();
    }
    if(ogreCamera)
    {
    Ogre::Real aspectRatio = Ogre::Real(newSize.width()) / Ogre::Real(newSize.height());
    ogreCamera->setAspectRatio(aspectRatio);
    }
    }
    update();
    }

    void OgreWidget::setCameraPosition(const Ogre::Vector3 &pos)
    {
    ogreCamera->setPosition(pos);
    ogreCamera->lookAt(0,50,0);
    update();
    emit cameraPositionChanged(pos);
    }

    void OgreWidget::keyPressEvent(QKeyEvent *e)
    {
    switch(e->key())
    {
    case Qt::Key_Escape:
    mContinue = false;
    break;
    case Qt::Key_Z:
    mDirection.z = -1;
    break;
    case Qt::Key_S:
    mDirection.z = 1;
    break;
    case Qt::Key_Q:
    mDirection.x = -1;
    break;
    case Qt::Key_D:
    mDirection.x = 1;
    break;
    case Qt::Key_PageUp:
    mDirection.y = 1;
    break;
    case Qt::Key_PageDown:
    mDirection.y = -1;
    break;
    }

    const Ogre::Vector3 &actualCamPos = ogreCamera->getPosition();
    setCameraPosition(actualCamPos + mDirection);

    e->accept();
    }

    void OgreWidget::keyReleaseEvent(QKeyEvent *e)
    {
    switch(e->key())
    {
    case Qt::Key_Z:
    mDirection.z = 0;
    break;
    case Qt::Key_S:
    mDirection.z = 0;
    break;
    case Qt::Key_Q:
    mDirection.x = 0;
    break;
    case Qt::Key_D:
    mDirection.x = 0;
    break;
    case Qt::Key_PageUp:
    mDirection.y = 0;
    break;
    case Qt::Key_PageDown:
    mDirection.y = 0;
    break;
    }

    e->accept();
    }

    QPaintEngine * OgreWidget::paintEngine() const
    {
    return 0;
    }

  2. #2
    Join Date
    Jul 2008
    Location
    Germany
    Posts
    511
    Thanks
    11
    Thanked 76 Times in 74 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows

    Default Re: Integrating Ogre in QMdiArea !

    Hi, if it works with a QWidget, why not use this and set it as the internal widget of the MdiSubWindow?

    Ginsengelf

    PS: if you post code, please use CODE tags to improve readability.

  3. #3
    Join Date
    Jun 2010
    Posts
    34
    Qt products
    Qt4
    Platforms
    Windows

    Question Re: Integrating Ogre in QMdiArea !

    That's what I did but it did not work. That's why I did derive OgreWidget from QMdiSubWidget.

    main.cpp :
    Qt Code:
    1. #include "OgreMainWindow.h"
    2.  
    3. #include <QtGui>
    4.  
    5. int main(int argc, char *argv[])
    6. {
    7. QApplication a(argc, argv);
    8.  
    9. OgreMainWindow w;
    10. w.show();
    11.  
    12. return a.exec();
    13. }
    To copy to clipboard, switch view to plain text mode 

    OgreMainWindow.h :
    Qt Code:
    1. #ifndef OgreMainWindow_H
    2. #define OgreMainWindow_H
    3.  
    4. #include <QtGui>
    5.  
    6. #include "OgreApplication.h"
    7.  
    8. class OgreMainWindow : public QMainWindow
    9. {
    10. Q_OBJECT
    11.  
    12. public:
    13. OgreMainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    14. ~OgreMainWindow();
    15.  
    16. public slots:
    17. void createOgreWidget();
    18.  
    19. private:
    20. QMdiArea * mdiArea;
    21.  
    22. OgreApplication * ogreApp;
    23. };
    24.  
    25. #endif // OgreMainWindow_H
    To copy to clipboard, switch view to plain text mode 

    OgreMainWindow.cpp :
    Qt Code:
    1. #include "OgreMainWindow.h"
    2.  
    3. OgreMainWindow::OgreMainWindow(QWidget *parent, Qt::WFlags flags)
    4. : QMainWindow(parent, flags)
    5. {
    6. mdiArea = new QMdiArea;
    7. setCentralWidget(mdiArea);
    8.  
    9. ogreApp = new OgreApplication;
    10.  
    11. QMenu * menuOgre = this->menuBar()->addMenu("Ogre");
    12.  
    13. QAction * ogreInitAction = menuOgre->addAction("Initialise");
    14. QObject::connect( ogreInitAction, SIGNAL(triggered()), ogreApp, SLOT(initialise()) );
    15.  
    16. QAction * ogreWidgetAction = menuOgre->addAction("Create Ogre Widget");
    17. QObject::connect( ogreWidgetAction, SIGNAL(triggered()), this, SLOT(createOgreWidget()) );
    18. }
    19.  
    20. OgreMainWindow::~OgreMainWindow()
    21. {
    22.  
    23. }
    24.  
    25. void OgreMainWindow::createOgreWidget()
    26. {
    27. OgreWidget * og = ogreApp->createOgreWidget();
    28. mdiArea->addSubWindow( (QMdiSubWindow*)og );
    29. //og->show();
    30. }
    To copy to clipboard, switch view to plain text mode 

    OgreApplication.h :
    Qt Code:
    1. #ifndef OGREAPPLICATION_H
    2. #define OGREAPPLICATION_H
    3.  
    4. #include <QObject>
    5. #include <Ogre.h>
    6.  
    7. class CNahGui;
    8. class OgreWidget;
    9.  
    10. class OgreApplication : public QObject
    11. {
    12. Q_OBJECT
    13.  
    14. public:
    15. OgreApplication(QObject *parent = 0);
    16. ~OgreApplication();
    17. void setupNLoadResources();
    18. void createScene();
    19.  
    20. public slots:
    21. void initialise();
    22. OgreWidget * createOgreWidget();
    23.  
    24. private:
    25. Ogre::Root *ogreRoot;
    26. Ogre::SceneManager *ogreSceneManager;
    27. static int nbRenderWindows;
    28. };
    29.  
    30. #endif // OGREAPPLICATION_H
    To copy to clipboard, switch view to plain text mode 

    OgreApplication.cpp :
    Qt Code:
    1. #include "OgreApplication.h"
    2.  
    3. #include "OgreWidget.h"
    4.  
    5. int OgreApplication::nbRenderWindows = 0;
    6.  
    7. OgreApplication::OgreApplication(QObject *parent)
    8. : QObject(parent),
    9. ogreRoot(0),
    10. ogreSceneManager(0)
    11. {
    12. }
    13.  
    14. OgreApplication::~OgreApplication()
    15. {
    16. if(ogreRoot)
    17. {
    18. if(ogreSceneManager)
    19. {
    20. ogreRoot->destroySceneManager(ogreSceneManager);
    21. }
    22. }
    23.  
    24. delete ogreRoot;
    25. }
    26.  
    27. void OgreApplication::initialise()
    28. {
    29. if (ogreRoot == 0)
    30. {
    31. ogreRoot = new Ogre::Root();
    32. }
    33.  
    34. // initialised ?
    35. if (!ogreRoot->isInitialised())
    36. {
    37. Ogre::RenderSystem *renderSystem = ogreRoot->getRenderSystemByName("OpenGL Rendering Subsystem");
    38. ogreRoot->setRenderSystem(renderSystem);
    39. ogreRoot->initialise(false);
    40. // Verify initialisation after initialise root
    41. if (!ogreRoot->isInitialised())
    42. {
    43. return;
    44. }
    45. }
    46. else
    47. {
    48. return;
    49. }
    50.  
    51. ogreSceneManager = ogreRoot->createSceneManager(Ogre::ST_GENERIC);
    52.  
    53. QMessageBox::information(0, "INFO", "OgreApplication initialised.");
    54. }
    55.  
    56. OgreWidget * OgreApplication::createOgreWidget()
    57. {
    58. nbRenderWindows++;
    59. OgreWidget * og = new OgreWidget();
    60. og->initialise(nbRenderWindows, ogreRoot, ogreSceneManager);
    61.  
    62. if (nbRenderWindows == 1)
    63. {
    64. setupNLoadResources();
    65. createScene();
    66. }
    67.  
    68. QMessageBox::information(0, "INFO", "OgreWidget initialised.");
    69.  
    70. return og;
    71. }
    72.  
    73. void OgreApplication::setupNLoadResources()
    74. {
    75. // Load resource paths from config file
    76. Ogre::ConfigFile cf;
    77. cf.load("resources.cfg");
    78.  
    79. // Go through all sections & settings in the file
    80. Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
    81.  
    82. Ogre::String secName, typeName, archName;
    83. while (seci.hasMoreElements())
    84. {
    85. secName = seci.peekNextKey();
    86. Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
    87. Ogre::ConfigFile::SettingsMultiMap::iterator i;
    88. for (i = settings->begin(); i != settings->end(); ++i)
    89. {
    90. typeName = i->first;
    91. archName = i->second;
    92. #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    93. // OS X does not set the working directory relative to the app,
    94. // In order to make things portable on OS X we need to provide
    95. // the loading with it's own bundle path location
    96. Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    97. Ogre::String(macBundlePath() + "/" + archName), typeName, secName);
    98. #else
    99. Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
    100. archName, typeName, secName);
    101. #endif
    102. }
    103. }
    104.  
    105. // Initialise, parse scripts etc
    106. Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
    107.  
    108. QMessageBox::information(0, "INFO", "Ressources initialised.");
    109. }
    110.  
    111. void OgreApplication::createScene()
    112. {
    113. ogreSceneManager->setAmbientLight(Ogre::ColourValue(1,1,1));
    114.  
    115. Ogre::Entity *robotEntity = ogreSceneManager->createEntity("Robot", "robot.mesh");
    116. Ogre::SceneNode *robotNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode("RobotNode");
    117. robotNode->attachObject(robotEntity);
    118. robotNode->yaw(Ogre::Radian(Ogre::Degree(-90)));
    119.  
    120. QMessageBox::information(0, "INFO", "Scene created.");
    121. }
    To copy to clipboard, switch view to plain text mode 
    Last edited by wysota; 2nd February 2012 at 10:04. Reason: removed URL

  4. #4
    Join Date
    Jun 2010
    Posts
    34
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Integrating Ogre in QMdiArea !

    and here the OgreWidget class (because the last message was too long) :

    OgreWidget.h :
    Qt Code:
    1. #ifndef OGREWIDGET_H
    2. #define OGREWIDGET_H
    3.  
    4. #include <QtGui>
    5. #include <Ogre.h>
    6.  
    7. class OgreWidget : public QMdiSubWindow, public Ogre::FrameListener
    8. {
    9. Q_OBJECT
    10.  
    11. public:
    12. OgreWidget(QWidget *parent = 0);
    13. ~OgreWidget();
    14. void initialise(int renderWindowId, Ogre::Root * root, Ogre::SceneManager * sceneManager);
    15. virtual bool frameStarted(const Ogre::FrameEvent &evt);
    16. virtual bool frameEnded(const Ogre::FrameEvent &evt);
    17. void setCameraPosition(const Ogre::Vector3 &pos);
    18.  
    19. virtual void showEvent(QShowEvent *e);
    20. virtual void paintEvent(QPaintEvent *e);
    21. virtual void moveEvent(QMoveEvent *e);
    22. virtual void resizeEvent(QResizeEvent *e);
    23.  
    24. virtual void keyPressEvent(QKeyEvent *e);
    25. virtual void keyReleaseEvent(QKeyEvent *e);
    26. QPaintEngine * paintEngine() const;
    27.  
    28. public slots:
    29. void setBackgroundColor(QColor c);
    30.  
    31. signals:
    32. void cameraPositionChanged(const Ogre::Vector3 &pos);
    33.  
    34. protected:
    35.  
    36. private:
    37. bool mContinue;
    38. Ogre::RenderWindow *ogreRenderWindow;
    39. Ogre::Viewport *ogreViewport;
    40. Ogre::Camera *ogreCamera;
    41. Ogre::Root *ogreRoot;
    42. Ogre::SceneManager *ogreSceneManager;
    43.  
    44. Ogre::Vector3 mDirection;
    45. };
    46.  
    47. #endif OGREWIDGET_H
    To copy to clipboard, switch view to plain text mode 

    OgreWidget.cpp :
    Qt Code:
    1. #include "OgreWidget.h"
    2.  
    3. OgreWidget::OgreWidget(QWidget *parent) :
    4. QMdiSubWindow(parent),
    5. ogreRenderWindow(0),
    6. ogreViewport(0),
    7. ogreCamera(0),
    8. mContinue(true),
    9. mDirection(Ogre::Vector3::ZERO)
    10. {
    11. setAttribute(Qt::WA_NoSystemBackground);
    12. setAttribute(Qt::WA_NoBackground);
    13. setAttribute(Qt::WA_PaintOnScreen);
    14. setAttribute(Qt::WA_OpaquePaintEvent);
    15. setMinimumSize(160,120);
    16. setFocusPolicy(Qt::ClickFocus);
    17. }
    18.  
    19. OgreWidget::~OgreWidget()
    20. {
    21. if (ogreRoot)
    22. {
    23. ogreRoot->detachRenderTarget(ogreRenderWindow);
    24. }
    25.  
    26. if(ogreRenderWindow)
    27. {
    28. ogreRenderWindow->removeAllViewports();
    29. }
    30. }
    31.  
    32. void OgreWidget::initialise(int renderWindowId, Ogre::Root * root, Ogre::SceneManager * sceneManager)
    33. {
    34. ogreRoot = root;
    35. ogreSceneManager = sceneManager;
    36.  
    37. Ogre::NameValuePairList viewConfig;
    38. Ogre::String widgetHandle;
    39. #ifdef Q_WS_WIN
    40. widgetHandle = Ogre::StringConverter::toString((size_t)((HWND)winId()));
    41. #else
    42. QWidget *q_parent = dynamic_cast <QWidget *> (parent());
    43. QX11Info xInfo = x11Info();
    44.  
    45. widgetHandle = Ogre::StringConverter::toString ((unsigned long)xInfo.display()) +
    46. ":" + Ogre::StringConverter::toString ((unsigned int)xInfo.screen()) +
    47. ":" + Ogre::StringConverter::toString ((unsigned long)q_parent->winId());
    48. #endif
    49. Ogre::String renderWindowIdStr = Ogre::StringConverter::toString(renderWindowId);
    50.  
    51. viewConfig["externalWindowHandle"] = widgetHandle;
    52. ogreRenderWindow = ogreRoot->createRenderWindow("Ogre rendering window"+renderWindowIdStr,
    53. width(), height(), false, &viewConfig);
    54.  
    55. ogreCamera = ogreSceneManager->createCamera("myCamera"+renderWindowIdStr);
    56. ogreCamera->setPosition(0, 50,150);
    57. ogreCamera->lookAt(0,50,0);
    58.  
    59. ogreViewport = ogreRenderWindow->addViewport(ogreCamera);
    60. ogreViewport->setBackgroundColour(Ogre::ColourValue(1,0,0));
    61. ogreCamera->setAspectRatio(Ogre::Real(width()) / Ogre::Real(height()));
    62.  
    63. ogreRoot->addFrameListener(this);
    64. }
    65.  
    66. bool OgreWidget::frameStarted(const Ogre::FrameEvent& evt)
    67. {
    68. //mCamera->translate(evt.timeSinceLastFrame);
    69. return mContinue;
    70. }
    71.  
    72. bool OgreWidget::frameEnded(const Ogre::FrameEvent& evt)
    73. {
    74. return mContinue;
    75. }
    76.  
    77. void OgreWidget::setBackgroundColor(QColor c)
    78. {
    79. if(ogreViewport)
    80. {
    81. Ogre::ColourValue ogreColour;
    82. ogreColour.setAsARGB(c.rgba());
    83. ogreViewport->setBackgroundColour(ogreColour);
    84. }
    85. update();
    86. }
    87.  
    88. void OgreWidget::showEvent(QShowEvent *e)
    89. {
    90. QMdiSubWindow::showEvent(e);
    91. }
    92.  
    93. void OgreWidget::paintEvent(QPaintEvent *e)
    94. {
    95. QMdiSubWindow::paintEvent(e);
    96.  
    97. ogreRoot->_fireFrameStarted();
    98. ogreRenderWindow->update();
    99. ogreRoot->_fireFrameEnded();
    100.  
    101. e->accept();
    102. }
    103.  
    104. void OgreWidget::moveEvent(QMoveEvent *e)
    105. {
    106. QMdiSubWindow::moveEvent(e);
    107.  
    108. if(e->isAccepted() && ogreRenderWindow)
    109. {
    110. ogreRenderWindow->windowMovedOrResized();
    111. }
    112. update();
    113. }
    114.  
    115. void OgreWidget::resizeEvent(QResizeEvent *e)
    116. {
    117. QMdiSubWindow::resizeEvent(e);
    118.  
    119. if(e->isAccepted())
    120. {
    121. const QSize &newSize = e->size();
    122. if(ogreRenderWindow)
    123. {
    124. ogreRenderWindow->resize(newSize.width(), newSize.height());
    125. ogreRenderWindow->windowMovedOrResized();
    126. }
    127. if(ogreCamera)
    128. {
    129. Ogre::Real aspectRatio = Ogre::Real(newSize.width()) / Ogre::Real(newSize.height());
    130. ogreCamera->setAspectRatio(aspectRatio);
    131. }
    132. }
    133. update();
    134. }
    135.  
    136. void OgreWidget::setCameraPosition(const Ogre::Vector3 &pos)
    137. {
    138. ogreCamera->setPosition(pos);
    139. ogreCamera->lookAt(0,50,0);
    140. update();
    141. emit cameraPositionChanged(pos);
    142. }
    143.  
    144. void OgreWidget::keyPressEvent(QKeyEvent *e)
    145. {
    146. switch(e->key())
    147. {
    148. case Qt::Key_Escape:
    149. mContinue = false;
    150. break;
    151. case Qt::Key_Z:
    152. mDirection.z = -1;
    153. break;
    154. case Qt::Key_S:
    155. mDirection.z = 1;
    156. break;
    157. case Qt::Key_Q:
    158. mDirection.x = -1;
    159. break;
    160. case Qt::Key_D:
    161. mDirection.x = 1;
    162. break;
    163. case Qt::Key_PageUp:
    164. mDirection.y = 1;
    165. break;
    166. case Qt::Key_PageDown:
    167. mDirection.y = -1;
    168. break;
    169. }
    170.  
    171. const Ogre::Vector3 &actualCamPos = ogreCamera->getPosition();
    172. setCameraPosition(actualCamPos + mDirection);
    173.  
    174. e->accept();
    175. }
    176.  
    177. void OgreWidget::keyReleaseEvent(QKeyEvent *e)
    178. {
    179. switch(e->key())
    180. {
    181. case Qt::Key_Z:
    182. mDirection.z = 0;
    183. break;
    184. case Qt::Key_S:
    185. mDirection.z = 0;
    186. break;
    187. case Qt::Key_Q:
    188. mDirection.x = 0;
    189. break;
    190. case Qt::Key_D:
    191. mDirection.x = 0;
    192. break;
    193. case Qt::Key_PageUp:
    194. mDirection.y = 0;
    195. break;
    196. case Qt::Key_PageDown:
    197. mDirection.y = 0;
    198. break;
    199. }
    200.  
    201. e->accept();
    202. }
    203.  
    204. QPaintEngine * OgreWidget::paintEngine() const
    205. {
    206. return 0;
    207. //return QWidget::paintEngine();
    208. }
    To copy to clipboard, switch view to plain text mode 

  5. #5
    Join Date
    Jun 2010
    Posts
    34
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Integrating Ogre in QMdiArea !

    nobody wants to test?

    I've given the entire source code, it's easy.

    If you want see the difference between the integration in the QMdiArea or not, take this change :
    - go to the fonction OgreMainWindow::createOgreWidget
    - remove the line mdiArea->addSubWindow( (QMdiSubWindow*)og );
    - add the line og->show();

    Without integration, you should see the ogre robot on a red background.

  6. #6
    Join Date
    Jun 2010
    Posts
    34
    Qt products
    Qt4
    Platforms
    Windows

    Default Re: Integrating Ogre in QMdiArea !

    OK I made some tests and the problem is not Qt. But in the architecture of my ogre Application. I will continue to search that on a Ogre Forum.

Similar Threads

  1. MacOsX + QtCreator + Ogre
    By bunjee in forum Qt Programming
    Replies: 2
    Last Post: 8th July 2011, 02:53
  2. QGraphicsView + Ogre renderer
    By bunjee in forum Qt Programming
    Replies: 1
    Last Post: 2nd March 2010, 01:01
  3. Integrating OpenVG with QT 4.6
    By ksrini in forum Qt Programming
    Replies: 1
    Last Post: 11th February 2010, 05:52
  4. Replies: 0
    Last Post: 17th August 2008, 17:31
  5. Integrating C with Qt
    By deepakn in forum Qt Programming
    Replies: 2
    Last Post: 4th December 2007, 09:12

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.