[PyQt] QGraphicsObject - Possible regression in PyQt5

Ales Erjavec ales.erjavec324 at gmail.com
Wed Feb 10 11:38:05 GMT 2016


On Sat, Feb 6, 2016 at 11:29 AM, Phil Thompson
<phil at riverbankcomputing.com> wrote:
> On 4 Feb 2016, at 10:21 am, Ales Erjavec <ales.erjavec324 at gmail.com> wrote:
>>
>> 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.
>
> Should be fixed in tonight's snapshot.
>
> Thanks,
> Phil

Testing on OSX with Python 3.5 and PyQt 5.5.2-snapshot-d304857728a3
the signal signature is 'signal(QGraphicsObject*)' and the emitted
argument is not None,
but unfortunately is of a wrong type (QtWidgets.QKeyEventTransition).

########

from PyQt5 import QtWidgets, QtCore

print("Using PyQt", QtCore.PYQT_VERSION_STR)


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("signal's signature:", bytes(method.methodSignature()).decode("ascii"))
# -> 'signal(QGraphicsObject*)'

def log(item):
    print("signal did emit with:", item)

obj = Obj()
obj.signal.connect(log)
#obj.signal.connect(log)
#obj.signal[QtWidgets.QGraphicsObject].connect(lambda item:
print("item:", item))

gitem = GraphicsObj()
obj.signal.emit(gitem)
# -> signal did emit with: <PyQt5.QtWidgets.QKeyEventTransition object at ...

#####

Note: If I connect the `obj.signal` to a second slot (commented out in
the example code)
the process terminates with a segmentation fault

Aleš Erjavec


More information about the PyQt mailing list