[PyQt] Cannot reparent a QGraphicsItem after reimplementing itemChange
Ales Erjavec
ales.erjavec324 at gmail.com
Fri Feb 19 11:01:06 GMT 2016
P.S. I just noticed that this is dependent on the order of execution.
Creating and
reparenting the graphics object BEFORE the signal
definitions/selectors, fixes the
problem.
On Fri, Feb 19, 2016 at 11:43 AM, Ales Erjavec
<ales.erjavec324 at gmail.com> wrote:
> 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