OGRE Wiki
Support and community documentation for Ogre3D
Ogre Forums
ogre3d.org
Log in
Username:
Password:
CapsLock is on.
Remember me (for 1 year)
Log in
Home
Tutorials
Tutorials Home
Basic Tutorials
Intermediate Tutorials
Mad Marx Tutorials
In Depth Tutorials
Older Tutorials
External Tutorials
Cookbook
Cookbook Home
CodeBank
Snippets
Experiences
Ogre Articles
Libraries
Libraries Home
Alternative Languages
Assembling A Toolset
Development Tools
OGRE Libraries
List of Libraries
Tools
Tools Home
DCC Tools
DCC Tutorials
DCC Articles
DCC Resources
Assembling a production pipeline
Development
Development Home
Roadmap
Building Ogre
Installing the Ogre SDK
Setting Up An Application
Ogre Wiki Tutorial Framework
Frequently Asked Questions
Google Summer Of Code
Help Requested
Ogre Core Articles
Community
Community Home
Projects Using Ogre
Recommended Reading
Contractors
Wiki
Immediate Wiki Tasklist
Wiki Ideas
Wiki Guidelines
Article Writing Guidelines
Wiki Styles
Wiki Page Tracker
Ogre Wiki Help
Ogre Wiki Help Overview
Help - Basic Syntax
Help - Images
Help - Pages and Structures
Help - Wiki Plugins
Toolbox
Freetags
Categories
List Pages
Structures
Trackers
Statistics
Rankings
List Galleries
Ogre Lexicon
Comments
History: QtOgre
View page
Source of version: 23
(current)
{DIV(class="achtung")}__IMPORTANT:__ This approach is outdated. For Ogre >= 1.12, rather use [https://ogrecave.github.io/ogre/api/latest/class_ogre_bites_1_1_application_context_qt.html|OgreBites::ApplicationContextQt].{DIV} There is a recent QOgreWidget written by djbe that is tested on Mac and Linux: [http://www.ogre3d.org/phpBB2/viewtopic.php?p=258064] ((User:Alanic|Alanic)) However the links pointing to this version are not valid anymore. A code snippet working on Mac OSX 10.6 with Cocoa, Qt 4.7.4 and Ogre 1.7.3 was inserted below. For a similar thread specific to Mac see [http://www.ogre3d.org/forums/viewtopic.php?f=2&t=62967]. I found this documentation: [http://lakin.weckers.net/index_ogre.html|Lakin's Ogre-Qt]. It is for Linux.. I prefer to do my development on my Windows machine (it has more ram / better video) and when I develop on Windows I use Visual Studio. As such, [http://www.qtnode.net/wiki/Qt4_with_Visual_Studio|these instructions] are priceless. Once you have Qt built and you've set up your environment variables, you can run qmake on Ogre-Qt to get a vcproj. Open that up in visual studio and the first thing you'll have to do is add the OGRE include directory to the C++ Additional Include Directories. If you try to build now you will see some errors like this: {CODE(wrap="1", colors="dos")}1>c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/tools/qhash.h(175) : error C2872: 'uint' : ambiguous symbol 1> could be 'c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/global/qglobal.h(632) : unsigned int uint' 1> or 'c:\ogresdk\include\OgrePrerequisites.h(134) : Ogre::uint'{CODE} There's a whole bunch of these, you need to add :: to the front of any reference to uint in the Qt code. You shouldn't need to recompile Qt after you do this. Then you need to add the OGRE lib directory to the Linker Additional Library Directories and add OgreMain.lib to Linker Inputs. For the debug configuration you will want to do the same but use OgreMain_d.lib. Of course, so far my success rate hasn't been too high. !!An Example using QT4 and Ogre Eihort This is a standard QT Widget with an Ogre instance in it. You can create one on QT's designer by elevating a regular widget to an "OgreWidget" and including ogrewidget.h in your project. You'll probably want to do something about the chooseRenderer() function, since it doesn't really do much right now. I generally derive another class from this one and reimplement chooseRenderer(), and build my world in that class. Good Luck with it! !!!project.pro: {CODE(wrap="1", colors="cpp-qt")} QT += widgets QT += opengl SOURCES += \ main.cpp \ ogrewidget.cpp HEADERS += \ ogrewidget.h INCLUDEPATH += "(OgreFolder)\\include" LIBS += -L"(OgreFolder)\\lib\\Release" -lcg LIBS += -L"(OgreFolder)\\lib\\Release" -lFreeImage LIBS += -L"(OgreFolder)\\lib\\Release" -lfreetype LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreMain LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreOverlay LIBS += -L"(OgreFolder)\\lib\\Release" -lOgrePaging LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreProperty LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreRTShaderSystem LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreTerrain LIBS += -L"(OgreFolder)\\lib\\Release" -lOgreVolume LIBS += -L"(OgreFolder)\\lib\\Release" -lOIS LIBS += -L"(OgreFolder)\\lib\\Release" -lzlib LIBS += -L"(OgreFolder)\\lib\\Release" -lzziplib LIBS += -L"(OgreFolder)\\boost\\lib" -llibboost_thread-vc120-mt-gd-1_55 LIBS += -L"(OgreFolder)\\boost\\lib" -llibboost_system-vc120-mt-gd-1_55 LIBS += -L"(OgreFolder)\\boost\\lib" -llibboost_date_time-vc120-mt-gd-1_55 LIBS += -L"(OgreFolder)\\boost\\lib" -llibboost_chrono-vc120-mt-gd-1_55 {CODE} Replace (OgreFolder) with the path of the folder in which you installed Ogre, for example C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Libraries\\OgreSDK\\OgreSDK_vc11_v1-9-0. Use two backslashes, not one. !!!ogrewidget.h: {CODE(wrap="1", colors="cpp-qt")}#ifndef __OGREWIDGET_H__ #define __OGREWIDGET_H__ #include <OGRE/Ogre.h> #include <QGLWidget> #include <QX11Info> class OgreWidget : public QGLWidget { //Q_OBJECT; public: OgreWidget( QWidget *parent=0 ): QGLWidget( parent ), mOgreWindow(NULL) { init( "../bin/plugins.cfg", "../bin/ogre.cfg", "../bin/ogre.log" ); } virtual ~OgreWidget() { mOgreRoot->shutdown(); delete mOgreRoot; destroy(); } protected: virtual void initializeGL(); virtual void resizeGL( int, int ); virtual void paintGL(); void init( std::string, std::string, std::string ); virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* ); Ogre::Root *mOgreRoot; Ogre::RenderWindow *mOgreWindow; Ogre::Camera *mCamera; Ogre::Viewport *mViewport; Ogre::SceneManager *mSceneMgr; }; #endif{CODE} !!!ogrewidget.cpp: {CODE(wrap="1", colors="cpp-qt")}#include "ogrewidget.h" #define THIS OgreWidget /** * @brief init the object * @author kito berg-taylor */ void THIS::init( std::string plugins_file, std::string ogre_cfg_file, std::string ogre_log ) { // create the main ogre object mOgreRoot = new Ogre::Root( plugins_file, ogre_cfg_file, ogre_log ); // setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad! mOgreRoot->setRenderSystem( renderSystem ); QString dimensions = QString( "%1x%2" ) .arg(this->width()) .arg(this->height()); renderSystem->setConfigOption( "Video Mode", dimensions.toStdString() ); // initialize without creating window mOgreRoot->getRenderSystem()->setConfigOption( "Full Screen", "No" ); mOgreRoot->saveConfig(); mOgreRoot->initialise(false); // don't create a window } /** * @brief setup the rendering context * @author Kito Berg-Taylor */ void THIS::initializeGL() { //== Creating and Acquiring Ogre Window ==// // Get the parameters of the window QT created Ogre::String winHandle; #ifdef WIN32 // Windows code winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId())); #elif MACOS // Mac code, tested on Mac OSX 10.6 using Qt 4.7.4 and Ogre 1.7.3 Ogre::String winHandle = Ogre::StringConverter::toString(winId()); #else // Unix code QX11Info info = x11Info(); winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId())); #endif Ogre::NameValuePairList params; #ifndef MACOS // code for Windows and Linux params["parentWindowHandle"] = winHandle; mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow", this->width(), this->height(), false, ¶ms ); mOgreWindow->setActive(true); WId ogreWinId = 0x0; mOgreWindow->getCustomAttribute( "WINDOW", &ogreWinId ); assert( ogreWinId ); // bug fix, extract geometry QRect geo = this->frameGeometry ( ); // create new window this->create( ogreWinId ); // set geometrie infos to new window this->setGeometry (geo); #else // code for Mac params["externalWindowHandle"] = winHandle; params["macAPI"] = "cocoa"; params["macAPICocoaUseNSView"] = "true"; mOgreWindow = mOgreRoot->createRenderWindow("QOgreWidget_RenderWindow", width(), height(), false, ¶ms); mOgreWindow->setActive(true); makeCurrent(); #endif setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); //== Ogre Initialization ==// Ogre::SceneType scene_manager_type = Ogre::ST_EXTERIOR_CLOSE; mSceneMgr = mOgreRoot->createSceneManager( scene_manager_type ); mSceneMgr->setAmbientLight( Ogre::ColourValue(1,1,1) ); mCamera = mSceneMgr->createCamera( "QOgreWidget_Cam" ); mCamera->setPosition( Ogre::Vector3(0,1,0) ); mCamera->lookAt( Ogre::Vector3(0,0,0) ); mCamera->setNearClipDistance( 1.0 ); Ogre::Viewport *mViewport = mOgreWindow->addViewport( mCamera ); mViewport->setBackgroundColour( Ogre::ColourValue( 0.8,0.8,1 ) ); } /** * @brief render a frame * @author Kito Berg-Taylor */ void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL assert( mOgreWindow ); mOgreRoot->renderOneFrame(); } /** * @brief resize the GL window * @author Kito Berg-Taylor */ void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->windowMovedOrResized(); } /** * @brief choose the right renderer * @author Kito Berg-Taylor */ Ogre::RenderSystem* THIS::chooseRenderer( Ogre::RenderSystemList *renderers ) { // It would probably be wise to do something more friendly // that just use the first available renderer return *renderers->begin(); }{CODE} !!For OGRE Cthugha (v1.7.3) In ogrewidget.cpp just replace.... {CODE(wrap="1", colors="cpp-qt")} // setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad! {CODE} with {CODE(wrap="1", colors="cpp-qt")} // setup a renderer Ogre::RenderSystemList::const_iterator renderers = mOgreRoot->getAvailableRenderers().begin(); while(renderers != mOgreRoot->getAvailableRenderers().end()) { Ogre::String rName = (*renderers)->getName(); if (rName == "OpenGL Rendering Subsystem") break; renderers++; } Ogre::RenderSystem *renderSystem = *renderers; {CODE} !!For Qt 5.x.x In Qt 5.x.x something is wrong with the resizing. The viewport ist positioned outside the visible area, so that you only see a black widget. To solve this problem you have to replace the following code in ogrewidget.cpp: {CODE(wrap="1", colors="cpp-qt")} void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->windowMovedOrResized(); } {CODE} with {CODE(wrap="1", colors="cpp-qt")} void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->reposition( this->pos().x(), this->pos().y() ); mOgreWindow->resize( width, height ); paintGL(); } {CODE} this {CODE(wrap="1", colors="cpp-qt")} void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL assert( mOgreWindow ); mOgreRoot->renderOneFrame(); } {CODE} with {CODE(wrap="1", colors="cpp-qt")} void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL swapBuffers(); assert( mOgreWindow ); mOgreRoot->renderOneFrame(); } {CODE} and this {CODE(wrap="1")} { ... setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); ... } {CODE} with {CODE(wrap="1")} { ... setAutoBufferSwap(false); setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); ... } {CODE} To use... {CODE(wrap="1", colors="cpp-qt")} #include <QApplication> #include <QWidget> #include "ogrewidget.h" #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(800, 600); window.setWindowTitle("Simple example"); OgreWidget* ogreWidget = new OgreWidget; QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ogreWidget); window.setLayout(layout); window.show(); return app.exec(); } {CODE} !!Possible errors The above code may produce compiling errors. If that's the case, try to replace: In ogrewidget.cpp: replace: {CODE(wrap="1", colors="cpp-qt")}Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers();{CODE} with: {CODE(wrap="1", colors="cpp-qt")}const Ogre::RenderSystemList *renderers = &(mOgreRoot->getAvailableRenderers());{CODE} replace: {CODE(wrap="1", colors="cpp-qt")}Ogre::RenderSystem* THIS::chooseRenderer( Ogre::RenderSystemList *renderers ){CODE} with: {CODE(wrap="1", colors="cpp-qt")}Ogre::RenderSystem* THIS::chooseRenderer(const Ogre::RenderSystemList *renderers ){CODE} In ogrewidget.h: replace: {CODE(wrap="1", colors="cpp-qt")}virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* );{CODE} with: {CODE(wrap="1", colors="cpp-qt")}virtual Ogre::RenderSystem* chooseRenderer(const Ogre::RenderSystemList* );{CODE} !!For Windows On Windows, you will have to remove {CODE(wrap="1", colors="cpp-qt")}#include <QX11Info>{CODE}
Search by Tags
Search Wiki by Freetags
Latest Changes
IDE Eclipse
FMOD SoundManager
HDRlib
Building Ogre V2 with CMake
Ogre 2.1 FAQ
Minimal Ogre Collision
Artifex Terra
OpenMB
Advanced Mogre Framework
MogreSocks
...more
Search
Find
Advanced
Search Help
Online Users
180 online users