[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] [Regression] QSGGeometry crash with PyQt 5.5
From:       Arjen Hiemstra <a.hiemstra () ultimaker ! com>
Date:       2015-07-27 12:25:37
Message-ID: CAJm25Z=NbA2exTnhA2L7m0pSc1trCeS29n7WOZC===RKt-rwDA () mail ! gmail ! com
[Download RAW message or body]

So it took some fiddling, but I managed to reduce it to a fairly
simple test case, which is attached to this mail.

Along the way, I discovered a few things:

* If I never store the new paint node, geometry and material, I get a
crash as soon as the item should be rendered with PyQt 5.5. With PyQt
5.4 it just never shows up.
* If I create the new paint node as a function-local variable, then
just before returning store them as member variables, everything
works.
* If I create the paint node as member variable, the first time
updatePaintNode is called, everything works. As soon as I call
update() on the item however, things crash.


On 24 July 2015 at 17:57, Phil Thompson <phil@riverbankcomputing.com> wrote:
> On 24/07/2015 4:45 pm, Arjen Hiemstra wrote:
>>
>> Hi,
>>
>> Using PyQt 5.4 the following code (from a custom QQuickItem) works:
>>
>>     def updatePaintNode(self, paint_node, update_data):
>>             self._node = QSGGeometryNode()
>>
>>             self._geometry =
>> QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 6, 12)
>>             self._geometry.setDrawingMode(0x0004)
>>             self._geometry.vertexDataAsPoint2D()[0].set(self._corner_size,
>> 0)
>>             self._geometry.vertexDataAsPoint2D()[1].set(0,
>> self._corner_size)
>>             self._geometry.vertexDataAsPoint2D()[2].set(0, self.height())
>>             self._geometry.vertexDataAsPoint2D()[3].set(self.width() -
>> self._corner_size, self.height())
>>             self._geometry.vertexDataAsPoint2D()[4].set(self.width(),
>> self.height() - self._corner_size)
>>             self._geometry.vertexDataAsPoint2D()[5].set(self.width(), 0)
>>
>>             self._geometry.indexDataAsUShort()[0] = 0
>>             self._geometry.indexDataAsUShort()[1] = 1
>>             self._geometry.indexDataAsUShort()[2] = 2
>>
>>             self._geometry.indexDataAsUShort()[3] = 0
>>             self._geometry.indexDataAsUShort()[4] = 2
>>             self._geometry.indexDataAsUShort()[5] = 3
>>
>>             self._geometry.indexDataAsUShort()[6] = 0
>>             self._geometry.indexDataAsUShort()[7] = 3
>>             self._geometry.indexDataAsUShort()[8] = 4
>>
>>             self._geometry.indexDataAsUShort()[9] = 0
>>             self._geometry.indexDataAsUShort()[10] = 4
>>             self._geometry.indexDataAsUShort()[11] = 5
>>
>>             self._node.setGeometry(self._geometry)
>>
>>             self._material = QSGFlatColorMaterial()
>>             self._material.setColor(self._color)
>>
>>             self._node.setMaterial(self._material)
>>
>>             return self._node
>>
>> Using PyQt5.5 the same code crashes. As far as I can tell, this is a
>> regression from PyQt5.4, unless I am doing something terribly wrong.
>
>
>>
>> With some testing, it seems something is going wrong with
>> QSGGeometry.defaultAttributes_Point2D() since removing that call and
>> passing None to the QSGGeometry constructor will make things work (but
>> no custom geometry shows up of course).
>>
>> Please let me know if you need any additional information.
>
>
> Have you got a short, complete script I can run the reproduce the problem?
>
> Phil
> _______________________________________________
> PyQt mailing list    PyQt@riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt

-- 


IMAGINE IT >> MAKE IT

Meet us online at Twitter <http://twitter.com/ultimaker>, Facebook 
<http://facebook.com/ultimaker>, Google+ <http://google.com/+Ultimaker>

www.ultimaker.com

["pyqt_bug.py" (text/x-python)]

#!/usr/bin/env python3

from PyQt5.QtCore import QUrl, Qt
from PyQt5.QtGui import QColor, QGuiApplication
from PyQt5.QtQml import QQmlComponent, qmlRegisterType
from PyQt5.QtQuick import QQuickItem, QSGGeometryNode, QSGGeometry, QSGFlatColorMaterial, QQuickView

import sys

class CustomItem(QQuickItem):
    def __init__(self, parent = None):
        super().__init__(parent)

        self.setFlag(QQuickItem.ItemHasContents)
        self.setAcceptedMouseButtons(Qt.LeftButton)
        self.setAcceptHoverEvents(True)

        self._corner_size = 15
        self._color = QColor(255, 0, 0, 255)

    def hoverEnterEvent(self, event):
        self._color = QColor(0, 255, 0, 255)
        self.update()

    def hoverLeaveEvent(self, event):
        self._color = QColor(255, 0, 0, 255)
        self.update()

    def updatePaintNode(self, paint_node, update_data):
        ### Does not Crash ###

        if paint_node is None:
            paint_node = QSGGeometryNode()

        geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 4, 6)
        geometry.setDrawingMode(QSGGeometry.GL_TRIANGLES)
        geometry.vertexDataAsPoint2D()[0].set(0, 0)
        geometry.vertexDataAsPoint2D()[1].set(0, self.height())
        geometry.vertexDataAsPoint2D()[2].set(self.width(), self.height())
        geometry.vertexDataAsPoint2D()[3].set(self.width(), 0)

        geometry.indexDataAsUShort()[0] = 0
        geometry.indexDataAsUShort()[1] = 1
        geometry.indexDataAsUShort()[2] = 3

        geometry.indexDataAsUShort()[3] = 1
        geometry.indexDataAsUShort()[4] = 2
        geometry.indexDataAsUShort()[5] = 3

        paint_node.setGeometry(geometry)

        material = QSGFlatColorMaterial()
        material.setColor(self._color)

        paint_node.setMaterial(material)

        # I need to store these otherwise they will be garbage collected before rendering.
        # With PyQt 5.4 this just means they never show up, with PyQt 5.5 it crashes.
        self._paint_node = paint_node
        self._geometry = geometry
        self._material = material

        return paint_node

        ### Crashes on the first call to update() ###

        #self._paint_node = QSGGeometryNode()

        #self._geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), 4, 6)
        #self._geometry.setDrawingMode(QSGGeometry.GL_TRIANGLES)
        #self._geometry.vertexDataAsPoint2D()[0].set(0, 0)
        #self._geometry.vertexDataAsPoint2D()[1].set(0, self.height())
        #self._geometry.vertexDataAsPoint2D()[2].set(self.width(), self.height())
        #self._geometry.vertexDataAsPoint2D()[3].set(self.width(), 0)

        #self._geometry.indexDataAsUShort()[0] = 0
        #self._geometry.indexDataAsUShort()[1] = 1
        #self._geometry.indexDataAsUShort()[2] = 3

        #self._geometry.indexDataAsUShort()[3] = 1
        #self._geometry.indexDataAsUShort()[4] = 2
        #self._geometry.indexDataAsUShort()[5] = 3

        #self._paint_node.setGeometry(self._geometry)

        #self._material = QSGFlatColorMaterial()
        #self._material.setColor(self._color)

        #self._paint_node.setMaterial(self._material)

        #return self._paint_node

app = QGuiApplication(sys.argv)
view = QQuickView()
qmlRegisterType(CustomItem, "CustomItem", 1, 0, "CustomItem")
view.setSource(QUrl.fromLocalFile("./pyqt_bug.qml"))
view.show()
app.exec_()

["pyqt_bug.qml" (application/octet-stream)]
[Attachment #5 (text/plain)]

_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic