[PyQt] return value from QGraphicsItem::itemChange is not handled properly.
Phil Thompson
phil at riverbankcomputing.com
Mon Sep 2 18:42:30 BST 2013
On Thu, 29 Aug 2013 14:58:07 +0000, Yann Le Hir <yann.le-hir at arteris.com>
wrote:
> Hi,
>
> I'm having an issue with QGraphicsItem::itemChange.
>
> Here is the test program :
>
> import PyQt5.Qt as qt
>
> class Node( qt.QGraphicsRectItem ) :
> def __init__( self , sector ) :
> super( Node , self ).__init__( sector )
>
> def itemChange( self , change , v ) :
> res = super( Node , self ).itemChange( change , v )
> print "itemChange return value : ",res
> return res
>
> b = qt.QGraphicsLineItem()
> c = qt.QGraphicsLineItem()
> a = Node(b)
> print a.parentItem(),b
> a.setParentItem(c)
> print a.parentItem(), c
>
>
> I get this output :
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x8f9f194>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x8f9f194>
> itemChange return value : <PyQt5.QtWidgets.QGraphicsLineItem object at
> 0x8f9f1dc>
> itemChange return value : <PyQt5.QtWidgets.QGraphicsLineItem object at
> 0x8f9f1dc>
> None <PyQt5.QtWidgets.QGraphicsLineItem object at 0x8f9f1dc>
>
> If I remove itemChange, I get this output :
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0xf2e6814c>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0xf2e6814c>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0xf2e68194>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0xf2e68194>
>
> I'm using PyQt-5.0, Sip 4.14.7 and Qt 5.1.0
> I tried with PyQt-5.0.1, sip 4.15.1 and Qt 5.1.0 without change.
>
> I digged into this, basically when setParentItem is called itemChange is
> called on this item and use the return value of itemChange to set the
> parent.
> In C itemChange returns a QVariant, which must be casted as a
> QGraphicsItem to be set as a parent.
> This took me to the Chimera::parse_py_type function. Apparently, someone
> (QT?) registers QGraphicsItem as a QMetaType, but not QGraphicsLineItem.
>
> If I replace :
> _metatype = QMetaType::type(_name.constData());
> By :
> if(strcmp(_name.constData(),"QGraphicsLineItem*")==0)
> _metatype = QMetaType::type("QGraphicsItem*");
> else
> _metatype = QMetaType::type(_name.constData());
>
> (I know how bad this is, but it's for demonstration purpose.)
>
> The output of the test program is then :
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x89ba194>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x89ba194>
> itemChange return value : <PyQt5.QtWidgets.QGraphicsLineItem object at
> 0x89ba1dc>
> itemChange return value : <PyQt5.QtWidgets.QGraphicsLineItem object at
> 0x89ba1dc>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x89ba1dc>
> <PyQt5.QtWidgets.QGraphicsLineItem object at 0x89ba1dc>
>
> Any ideas on how to fix this properly ?
Should be fixed in tonight's PyQt5 snapshot.
Phil
More information about the PyQt
mailing list