[PyQt] QGraphicsObject - Possible regression in PyQt5

Ales Erjavec ales.erjavec324 at gmail.com
Thu Feb 4 10:21:52 GMT 2016


Hello,

There seems to be a regression in PyQt5 when using QGraphicsObject
in a pyqtSignal definition.

When a signal is defined in a QObject as `signal = pyqtSignal(QGraphicsObject)`
the resulting meta object method will have a signature of
'signal(QGraphicsItem*)',
but in PyQt4 this would have been 'signal(QGraphicsObject*)'.

Worse when the signal is actually emitted with an instance of a QGraphicsObject
the receivers all get a None instead of the intended instance.
This worked in PyQt4.


from PyQt5 import QtWidgets, QtCore

class GraphicsObj(QtWidgets.QGraphicsObject):
    def paint(self, painter, option, widget):
        pass
    def boundingRect(self):
        return QtCore.QRectF()


class Obj(QtCore.QObject):
    signal = QtCore.pyqtSignal(QtWidgets.QGraphicsObject)


meta = Obj.staticMetaObject
method = meta.method(meta.methodCount() - 1)
print(method.methodSignature())
# -> b'signal(QGraphicsItem*)'
# in PyQt4 this would have been 'signal(QGraphicsObject*)'

def assert_not_none(item):
    assert item is not None

obj = Obj()
obj.signal.connect(assert_not_none)

gitem = GraphicsObj()
# This will trigger the assertion error in the connected slot
obj.signal.emit(gitem)


Tested on:
    *OSX, Python 3.5, PyQt 5.5.1 (homebrew installed)
    * Debian, Python 3.4.2, PyQt 5.3.2


For reference, this is the equivalent code in PyQt4:


from PyQt4 import QtGui, QtCore

class GraphicsObj(QtGui.QGraphicsObject):
    def paint(self, painter, option, widget):
        pass
    def boundingRect(self):
        return QtCore.QRectF()


class Obj(QtCore.QObject):
    signal = QtCore.pyqtSignal(QtGui.QGraphicsObject)


meta = Obj.staticMetaObject
method = meta.method(meta.methodCount() - 1)
print(method.signature())
# -> 'signal(QGraphicsObject*)'

def assert_not_none(item):
    assert item is not None

obj = Obj()
obj.signal.connect(assert_not_none)

gitem = GraphicsObj()
obj.signal.emit(gitem)


Aleš Erjavec


More information about the PyQt mailing list