Russian Qt Forum
Сентябрь 24, 2024, 20:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: OGRE RenderWindow и Qt4  (Прочитано 3835 раз)
w63f
Гость
« : Июль 15, 2009, 11:26 »

Здравствуйте!
Пытаюсь прикрутить OGRE к Qt. Использую для этого Python-Ogre и PyQt4 соответственно. Воспользовавшись примером c сайта про python-ogre у меня получилось следующее:

Код:
from PyQt4 import QtOpenGL,QtCore,QtGui
import ogre.renderer.OGRE as Ogre
import sys

class OgreScene (QtGui.QGraphicsScene):
def __init__(self,parent = None):
QtGui.QGraphicsScene.__init__(self,parent)
self.root = None
self.renderwindow = None
self.camera = None
self.viewport = None
self.scene = None

self.setRoot()
self.preload()


self.timer = QtCore.QTimer(self)                                               
self.connect(self.timer,QtCore.SIGNAL("timeout()"),self,QtCore.SLOT("update()"))
self.timer.start(100)

def setRoot(self):
self.root = Ogre.Root("plugins.cfg","ogre.cfg","ogre.log")
if self.root.restoreConfig() or self.root.showConfigDialog():
self.root.initialise(False)

self.connect(self, QtCore.SIGNAL("sceneRectChanged(const QRectF &)"), self.handleResize)

def preload(self):
hello = QtGui.QDialog()
hello.setWindowOpacity(0.8)
hello.setWindowTitle("Hello, world!")
hello.setLayout(QtGui.QVBoxLayout())

label = QtGui.QLabel(QtCore.QString("Hullo."))
hello.layout().addWidget(label)

self.addWidget(hello)

for item in self.items():
item.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
item.setCacheMode(QtGui.QGraphicsItem.DeviceCoordinateCache)
item.setPos(QtCore.QPointF(0, 0))

def handleResize(self,rect):
if self.renderwindow:
#self.renderwindow.resize(int(rect.x()*100.0), int(rect.y()*100.0))

self.renderwindow.windowMovedOrResized()

def drawBackground(self,painter,rect):
if self.renderwindow == None:
#assert(self.painter.paintEngine().type() == QtGui.QPaintEngine.OpenGL)
self.initOgre();

self.root.renderOneFrame()

def initOgre(self):
params = Ogre.NameValuePairList()
#params['currentWindowHandle'] = Ogre.UTFString("0")
params["currentGLContext"] = Ogre.UTFString("True")

self.renderwindow = self.root.createRenderWindow("MainRenderWindow", 640, 480, False, params)

if self.renderwindow == None:
print 'Error: Render window doesn\'t init!'
return

#self.renderwindow.setVisible(True)

self.loadResources()

self.scene = self.root.createSceneManager("DefaultSceneManager", "g3d SceneManager")
self.camera = self.scene.createCamera("g3d Camera")
self.viewport = self.renderwindow.addViewport(self.camera)
self.viewport.setBackgroundColour(Ogre.ColourValue(0.1, 0.1, 0.1, 1.0))
self.scene.setAmbientLight(Ogre.ColourValue(0.5, 0.5, 0.5))
l = self.scene.createLight("MainLight")
l.setPosition(200, 80, 100)
l.setDiffuseColour(Ogre.ColourValue(1.0, 0.5, 0.0))

sphereEnt = self.scene.createEntity("Sphere", "sphere.mesh")
sphereNode = self.scene.getRootSceneNode().createChildSceneNode("SphereNode")

sphereNode.setVisible(True)
sphereNode.attachObject(sphereEnt)

sphereNode.setPosition(0, 0, 0)
self.camera.setPosition(50, 50, 400)
self.camera.lookAt(50, 50, 400)

self.renderwindow.setVisible(True)

print 'Ogre has been inited'

def loadResources(self):
config = Ogre.ConfigFile()
config.load('resources.cfg')

seci = config.getSectionIterator()
while (seci.hasMoreElements()):
secName = seci.peekNextKey()
settings = seci.getNext()
for i in settings:
typeName = i.key
archName = i.value
Ogre.ResourceGroupManager.getSingleton().addResourceLocation(archName,typeName,secName)

Ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups()


if __name__ == "__main__":
app =  QtGui.QApplication(sys.argv)

mwin = QtGui.QWidget()
scene = OgreScene()
gr = QtGui.QGridLayout()
view = QtGui.QGraphicsView(scene)
gr.addWidget(view,0,0)
mwin.setLayout(gr)
mwin.show()

sys.exit(app.exec_())

Результат выполнения можно увидеть во вложении. Им является пара окон: qt's mainwindow и OGRE's renderwindow.

Да, оно работает. Работает нормально. Единственное, что меня не устраивает, так это то, что огровский renderwindow висит вне кьютишного окна. Вопрос заключается в том, можно ли его поместить в область окна, и если да, то как это сделать?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 21.