[PyQt] PyQt5 fails to handle QQuickImageProvider subclassing

Phil Thompson phil at riverbankcomputing.com
Mon Jan 9 17:06:13 GMT 2017


On 5 Jan 2017, at 1:47 pm, Julio César Gázquez <julio_lists at mebamutual.com.ar> wrote:
> 
> El 04/01/17 a las 16:17, Phil Thompson escribió:
>>> ImageProvider supports Image type but has not implemented requestImage()
>>> 
>>> Seems this message comes from Qt's QQuickImageProvider::requestImage() implementation, so it's like the C++ method isn't being overridden by the PyQt's wrapper method.
>>> 
>>> These methods are somewhat peculiar, as they are virtual methods (and specifically meant to be subclassed) and have an /Out/ parameter. Doing a grep on the PyQt sources I see this only happens in two places outside this class. Maybe the wrapper for the virtual method lacks the /Out/ parameter?
>>> 
>>> 
>> Try it, just pip install the latest version into a venv.
> No, I'm afraid it doesn't work even with 5.7.1 (via pip install on Ubuntu Xenial):
> 
> julio at marte:~/devel/test$ python3 test.py
> ImageProvider supports Image type but has not implemented requestImage()
> file:///home/julio/devel/test/test.qml:3:1: QML Image: Failed to get image from provider: image://images/any.jpg
> 
>> Otherwise I would need a short complete example that demonstrates the problem.
>> 
> Minimal test example below.
> 
> test.py:
> 
> from PyQt5.QtCore import QUrl, Qt
> from PyQt5.QtGui import QGuiApplication, QImage
> from PyQt5.QtQuick import QQuickView, QQuickImageProvider
> 
> 
> class ImageProvider(QQuickImageProvider):
> 
>    def __init__(self):
>        super().__init__(QQuickImageProvider.Image)
> 
>    def requestImage(self, id_, requestedSize):
>        """ Just a red image """
>        image = QImage(requestedSize.width(), requestedSize.height())
>        image.fill(Qt.red)
>        return image, requestedSize
> 
> 
> class Application(QGuiApplication):
> 
>    def __init__(self, argv):
>        super().__init__(argv)
>        self._view = QQuickView()
>        self._view.engine().addImageProvider("images", ImageProvider())
>        self._view.setSource(QUrl.fromLocalFile("test.qml"))
>        self._view.show()
> 
> 
> if __name__ == '__main__':
>    app = Application([])
>    app.exec_()
> 
> 
> test.qml:
> 
> import QtQuick 2.1
> 
> Image {
>    width: 400
>    height: 300
>    source: "image://images/any.jpg"
> }
> 
> TIA.

Should be fixed in tonight's SIP snapshot.

Thanks,
Phil


More information about the PyQt mailing list