Python QQuickFrameBufferObject导致PySide2崩溃
我试图创建一个简单的Python QQuickFrameBufferObject导致PySide2崩溃,python,qt,qt5,qtquick2,pyside2,Python,Qt,Qt5,Qtquick2,Pyside2,我试图创建一个简单的QQuickFrameBufferObject,以便在Qt-Quick中渲染一些自定义opengl纹理。所以我决定用PySide2测试它。下面是一个简单的实现: from PySide2.QtQuick import QQuickFramebufferObject from PySide2.QtGui import QOpenGLFramebufferObjectFormat, QOpenGLFramebufferObject from PySide2.QtCore impo
QQuickFrameBufferObject
,以便在Qt-Quick中渲染一些自定义opengl纹理。所以我决定用PySide2测试它。下面是一个简单的实现:
from PySide2.QtQuick import QQuickFramebufferObject
from PySide2.QtGui import QOpenGLFramebufferObjectFormat, QOpenGLFramebufferObject
from PySide2.QtCore import QSize, Qt
class FboRenderer(QQuickFramebufferObject.Renderer):
def __init__(self, parent=None):
super().__init__(parent)
print("Creating renderer")
def createFrameBufferObject(self, size):
format = QOpenGLFramebufferObjectFormat()
format.setAttachment(QOpenGLFramebufferObject.Depth)
return QOpenGLFramebufferObject(size, format)
def synchronize(self, item):
print("Synchronizing")
def render(self):
print("Rendering")
class OpenGLCanvas(QQuickFramebufferObject):
def __init__(self, parent=None):
super().__init__(parent)
def createRenderer(self):
return FboRenderer()
然后,为了在QML中使用它,我使用了:
qmlRegisterType(OpenGLCanvas,"OpenGLCanvas", 1, 0, "OpenGLCanvas")
现在,应用程序运行并显示“创建渲染器”,但几秒钟后就会崩溃 > P> >问题是
createFrameBufferObject
中有一个输入错误,因为它必须是createFrameBufferObject
,这也会显示一个类似于初始错误的错误,因此解决方案类似
类fborender(QQuickFramebufferObject.Renderer):
定义初始化(自):
super()。\uuuu init\uuuuu()
打印(“创建渲染器”)
self._fbos=[]
def createFramebufferObject(自身,大小):
fmt=QOpenGLFramebufferObjectFormat()
fmt.setAttachment(QOpenGLFramebufferObject.Depth)
fbo=QOpenGLFramebufferObject(大小,fmt)
自我附加(fbo)
返回固定基地运营商
def同步(自我,项目):
打印(“同步”)
def渲染(自):
打印(“渲染”)
类OpenGLCanvas(QQuickFramebufferObject):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.\u渲染器=无
def createRenderer(自):
如果self.\u渲染器为无:
self.renderer=fborender()
返回自渲染器
使用列表来存储<代码> QopunLFRAMBuffServices < /C> >而不是使用类成员?@ DaljIT97 MMM,我看到了您知道C++的原因,所以解释会更容易。您已经看到,这两个方法都返回一个指针,因此负责管理动态内存的是调用这些方法的类,它们也会这样做。检查我找到的源代码createRenderer()
只被调用一次,而createFramebufferObject()
被调用了n次,因此我创建了一个实例或使用了一个列表。
import QtQuick 2.12
import QtQuick.Window 2.12
import OpenGLCanvas 1.0
Window{
id: win
visible: true
OpenGLCanvas{
anchors.fill: parent
}
}