[PyQt] Python properties on virtual methods

Phil Thompson phil at riverbankcomputing.com
Tue Apr 21 17:09:35 BST 2015


On 21/04/2015 4:48 pm, Alessandro Pasotti wrote:
> 2015-04-21 17:20 GMT+02:00 Phil Thompson <phil at riverbankcomputing.com>:
> 
>> On 21/04/2015 4:12 pm, Alessandro Pasotti wrote:
>> 
>>> Hi,
>>> 
>>> I noticed that if I create a property() alias on a virtual method, 
>>> the
>>> alias will always call the base class method instead of the concrete
>>> instance method.
>>> 
>>> Is this the expected behaviour?
>>> Is it documented somewhere?
>>> 
>>> Here using PyQt4 4.8.5 and python 2.7, SIP should be 4.15.5
>>> 
>> 
>> A simple, complete example that demonstrates the problem would help.
>> 
> 
> 
> Hi Phil,
> 
> I know an example would help but a simple one is not possible: I'm 
> working
> on a QT app embedded in a python plugin embedded in a 10K sloc C++ app.
> 
> But, I try.
> 
> instance "d" is a QgsPostgresProvider : public QgsVectorDataProvider
> https://github.com/elpaso/QGIS/blob/master/src/providers/postgres/qgspostgresprovider.h
> which is a subclass of QgsVectorDataProvider
> https://github.com/elpaso/QGIS/blob/master/src/core/qgsvectordataprovider.h
> API Docs: http://qgis.org/api/qgsvectordataprovider_8h_source.html
> 
> 
> In [70]: d = l.dataProvider()
> 
> 
> In [71]: d
> 
> Out[71]: <qgis._core.QgsVectorDataProvider at 0x7f132375fb00>
> 
> 
> In [72]: d.capabilities?
> 
> Docstring: QgsVectorDataProvider.capabilities() -> int
> 
> Type: builtin_function_or_method
> 
> 
> In [73]: d.capabilities()
> 
> Out[73]: 115615
> 
> 
> In [74]: d.__class__.capabilities2 = property(d.__class__.capabilities)
> 
> 
> In [75]: d.capabilities2?
> 
> Type: property
> 
> String form: <property object at 0x7f1322ac6470>
> 
> Docstring: QgsVectorDataProvider.capabilities() -> int
> 
> 
> 
> In [76]: d.capabilities2
> 
> Out[76]: 0
> 
> 
> The problem is that instruction 73 calls
> QgsPostgresProvider::capabilities() while instruction 76 calls
> QgsVectorDataProvider::capabilities()
> https://github.com/elpaso/QGIS/blob/master/src/core/qgsvectordataprovider.cpp#L107
> and returns 0 (NO CAPABILITIES).
> 
> Am I doing something wrong?

I have no idea. The firts person to ask is whoever did the Qgs bindings.

Phil


More information about the PyQt mailing list