[PyQt] Cannot reparent a QGraphicsItem after reimplementing itemChange
Ales Erjavec
ales.erjavec324 at gmail.com
Fri Feb 19 10:43:27 GMT 2016
Hello,
This seems to be fixed in the daily snapshots (most likely by a fix for:
https://www.riverbankcomputing.com/pipermail/pyqt/2016-February/036877.html),
however since it took me a better part of 2 days to distill the
problem into a reproducible
test case, I think it is best to report this anyway
Reimplementing a QGraphicsItem.itemChange would break reparenting the
object to a QGraphicsObject instance. At first it seemed like a
resurgence of:
https://riverbankcomputing.com/pipermail/pyqt/2012-August/031818.html
However a simple reproducible test case proved elusive. The problem
only manifests after either defining a pyqtSignal with a QObject
subtype (i.e. QAction,
QAbstractButton, ...) or using the QObject subtype as the signal selector (e.g.
`triggered[QAction]`). Specifying the C++ type by string name (e.g.
`signal = pyqtSignal("QAction*")` or `triggered["QAction*"]` does not
trigger this.
#####
from PyQt5 import QtWidgets, QtCore
class GraphicsObj(QtWidgets.QGraphicsObject):
def itemChange(self, change, value):
if change == self.ItemParentChange:
print("parent change", value)
rval = super().itemChange(change, value)
if change == self.ItemParentChange:
print("\t->", rval)
return rval
class Object(QtCore.QObject):
# A single signal definition triggers the bug
signal = QtCore.pyqtSignal(QtWidgets.QAction)
# This one does not
# signal = QtCore.pyqtSignal("QAction *")
obj = Object()
obj.signal[QtWidgets.QAction] # This also triggers it
obj.signal["QAction*"] # This does not
obj = GraphicsObj()
objparent = GraphicsObj()
obj.setParentItem(objparent)
assert obj.parentItem() is not None
#####
Tested on:
*OSX, Python 3.5, PyQt 5.5.1 (homebrew installed)
* Debian, Python 3.4.2, PyQt 5.3.2
Aleš Erjavec
More information about the PyQt
mailing list