[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