[PyQt] return value from QGraphicsItem::itemChange is not handled properly.
Yann Le Hir
yann.le-hir at arteris.com
Thu Aug 29 15:58:07 BST 2013
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 ?
Regards,
Yann.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20130829/00f731ff/attachment.html>
More information about the PyQt
mailing list