<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On 16 May 2018 at 11:30, Phil Thompson <span dir="ltr"><<a href="mailto:phil@riverbankcomputing.com" target="_blank">phil@riverbankcomputing.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 16 May 2018, at 11:27 am, J Barchan <<a href="mailto:jnbarchan@gmail.com">jnbarchan@gmail.com</a>> wrote:<br>
> ​Dear Phil,<br>
> <br>
> I previously wrote that I had had to give up on overriding QSqlQueryModel.data() because​ none of the solutions we discussed (concerning return type of native Python type versus QVariant type) worked acceptably for me.  I have since discovered that, for various reasons, I have to provide a Python override of that method.<br>
> <br>
> I have revisited this issue, and have come up with a solution which seems to work in all cases but which we did not propose between the two of us.<br>
> <br>
> Reminder of problems:<br>
>       • Without the sip.enableautoconversion(<wbr>QVariant, False) call, overridden QSqlQueryModel.data() definition, at least when called on database NULL value for role DisplayRole, would return a "default" value string like 0 or '', which is wrong (I need blank/empty).<br>
>       • With the sip.enableautoconversion(<wbr>QVariant, False) call, and returning the QVariant as-is, solved the above case perfectly but meant that Python callers of the method would need to be changed to call QVariant.value() on the return result to behave as before now, which is not at all good for the existing code I have inherited.<br>
> There did not seem to be an alternative which just "worked" for me.  I have now come up with the following override code:<br>
> <br>
> def data(self, item: QtCore.QModelIndex, role: QtCore.Qt.ItemDataRole = QtCore.Qt.DisplayRole):<br>
>     was_enabled = sip.enableautoconversion(<wbr>QtCore.QVariant, False)<br>
>     v = super().data(item, role)<br>
>     sip.enableautoconversion(<wbr>QtCore.QVariant, was_enabled)<br>
>     if not v.isValid() or v.isNull():<br>
>         return None<br>
>     else:<br>
>         return v.value()<br>
> Note how:<br>
>       • In the invalid or NULL cases, it explicitly returns Python native None.  That is instead of v.value(), which would have returned 0 or ''.  This solves Problem #1 above.<br>
>       • In the valid, non-NULL case, it returns QVariant.value(), i.e. native Python type, keeping Python callers unchanged.  This solves Problem #2 above.<br>
> Would you kindly comment whether you agree this definition is acceptable?  Do you see any pitfalls, or need to change any code here (e.g. based on role value)?  I can only say that I have tried running with this, and am finding all the cases I can see are working correctly/as desired, but cannot be sure there is a case I have not thought of....<br>
> <br>
> <br>
> I'd really appreciate your feedback on this (hoping you'll agree with me!!), thank you.<br>
<br>
</span>It seems fine so long as your use case doesn't require you to distinguish between null and invalid values.<br>
<span class="HOEnZb"><font color="#888888"><br>
Phil</font></span></blockquote></div><br><div style="font-family:tahoma,sans-serif" class="gmail_default">​Thanks for looking.  Yes, I agree, so far I can only say empirically the base method sometimes returns an invalid <span style="font-family:monospace,monospace">QVariant</span> and other times a valid <span style="font-family:monospace,monospace">QVariant</span> which is null, and with my now returning <span style="font-family:monospace,monospace">None</span> in both situations all <i>seems</i> to be well...<br clear="all"></div><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><span style="font-family:tahoma,sans-serif">Kindest,</span></div><div><span style="font-family:tahoma,sans-serif">Jonathan</span></div></div></div></div></div>
</div></div>