[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