[PyQt] Problem with QVariant float arguments

Phil Thompson phil at riverbankcomputing.com
Wed Oct 24 17:10:58 BST 2018


On 15 Oct 2018, at 1:47 pm, Baz Walter <bazwal at gmail.com> wrote:
> 
> Hello
> 
> 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?

> f = QtCore.Qt.MatchExactly # QVariant matching
> 
> assert m.match(m.index(0, 0), r, x0, 1, f)[0].row() == 0
> assert m.match(m.index(0, 0), r, x1, 1, f)[0].row() == 1
> assert m.match(m.index(0, 0), r, x2, 1, f)[0].row() == 2
> assert m.match(m.index(0, 0), r, x3, 1, f)[0].row() == 3
> 
> Traceback (most recent call last):
>  File "test_qvariant_float.py", line 23, in <module>
>    assert m.match(m.index(0, 0), r, x3, 1, f)[0].row() == 3
> AssertionError
> 
> And the same behaviour is seen with other equivalent Qt APIs:
> 
> c = QtWidgets.QComboBox(); c.setModel(m)
> 
> assert c.findData(x0) == 0
> assert c.findData(x1) == 1
> assert c.findData(x2) == 2
> assert c.findData(x3) == 3
> 
> Traceback (most recent call last):
>  File "test_qvariant_float.py", line 31, in <module>
>    assert c.findData(x3) == 3
> AssertionError

Phil



More information about the PyQt mailing list