[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    Re: [PyQt] Problem with QVariant float arguments
From:       Baz Walter <bazwal () gmail ! com>
Date:       2018-10-25 14:05:20
Message-ID: 35388017-c148-5326-c3f7-9c41758a025f () gmail ! com
[Download RAW message or body]

On 24/10/2018 17:10, Phil Thompson wrote:
> On 15 Oct 2018, at 1:47 pm, Baz Walter <bazwal@gmail.com> wrote:
> > 
> > There seems to be a problem when passing python floats above a certain size to Qt \
> > methods which take a QVariant argument. Could there be some kind of truncation \
> > taking place? My test set up: python 3.7.0, qt 5.11.2, sip 4.19.13, pyqt 5.11.3, \
> > gcc 8.2.1 20180831. 
> > Here is a test script:
> > 
> > from PyQt5 import QtCore, QtGui, QtWidgets
> > 
> > a = QtWidgets.QApplication(['test'])
> > 
> > x0 = 1.001
> > x1 = 1.002
> > x2 = 1523015317.001
> > x3 = 1523015317.002
> > 
> > m = QtGui.QStandardItemModel(); r = QtCore.Qt.UserRole
> > i = QtGui.QStandardItem('0'); i.setData(x0, r); m.appendRow(i)
> > i = QtGui.QStandardItem('1'); i.setData(x1, r); m.appendRow(i)
> > i = QtGui.QStandardItem('2'); i.setData(x2, r); m.appendRow(i)
> > i = QtGui.QStandardItem('3'); i.setData(x3, r); m.appendRow(i)
> 
> Adding...
> 
> v = i.data(r)
> print(v, type(v))
> 
> ...shows the expected value, ie. the conversion seems to be working. That suggests \
> it is a Qt problem? 

I ported my test to C++ and found that the assert fails there, too. The 
problem seems to be in the way Qt chooses to compare FP values. It first 
tests using (a == b), and then if that fails it returns the result of 
qFuzzyCompare(a, b) instead. Now of course comparing FP values using 
only the equals operator is never reliable, but in the above example the 
irony is that equals actually gets it right and qFuzzyCompare gets it wrong:

     >>> 1523015317.001 == 1523015317.000
     False
     >>> QtCore.qFuzzyCompare(1523015317.001, 1523015317.000)
     True

Anyway, it seems the Qt devs are already aware that QVariant comparisons 
can be generally problematic (depending on the underlying types), so I 
don't think I'll bother pursuing this any further. The easiest 
work-around in the above example is to simply use string-based matching 
instead of variant-based matching. But I suppose that also must have its 
limitations when comparing floats (fortunately all my values have a 
fixed precision).
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
https://www.riverbankcomputing.com/mailman/listinfo/pyqt


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic