Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QQuickFrameBufferObject导致PySide2崩溃_Python_Qt_Qt5_Qtquick2_Pyside2 - Fatal编程技术网

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> >问题是 fBoeNeReulver()/Cux>是一个本地变量,它将被立即销毁,因此它也会破坏C++对象,因为访问了未保留的内存,导致了分割错误。 另一方面,您在
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
    }
}