[PyQt] PyQt 5.7, QSqlQueryModel.data() sub-classed override bug?

Hans-Peter Jansen hpj at urpla.net
Tue May 8 21:59:24 BST 2018


Hi Jonathan,

On Dienstag, 8. Mai 2018 20:22:12 J Barchan wrote:

> > You can't have it both ways. Either you let PyQt automatically convert
> > to/from QVariant (and you lose the detection of nulls) or you do it
> > yourself (converting to Python using the value() method).
> 
> I'm not asking to have anything both ways.​  I'm just asking how to write
> code so that the overridden method behaves *absolutely identically* to the
> base method it's overriding.  Surely that must be possible?
> 
> I remind you: when I have no override for ​QSqlQueryModel.data() *everything
> behaves perfectly*.  I am saying: there is no problem, NULLs are handled as
> such and non-NULLs are correctly converted to their Python equivalent.  I
> do not know how NULLs work (what they are returned as), but everything just
> works.
> 
> As soon as I write an override which just returns the base method, it goes
> wrong on NULL.  If I put it the sip.autoconversion(False), it works on NULL
> but now returns a QVariant where it used to return a Python native type, I
> think.
> 
> All I want to know is: how can I write an override of  ​
> QSqlQueryModel.data() in Python/PyQt like:
> 
> def data(self, index: QtCore.QModelIndex, role=QtCore.Qt.DisplayRole) ->
> typing.Any:
>      value = super().data(index, role)
>      return value
> 
> such that it returns *just exactly the same as* QSqlQueryModel.data() would
> have done, please, please, please?

Well, in a perfect world, you would get what you want, but we don't live in a 
perfect world... What hinders you to convert any QVariant yourself?

It's additional one or two lines of code per type, or, if it is getting too 
"spagetti", a dict "switch" with type as key.

Cheers,
Pete


More information about the PyQt mailing list