On Wed, Jun 3, 2009 at 2:40 PM, Darren Dale <dsdal...@gmail.com> wrote:
> On Wed, Jun 3, 2009 at 2:20 PM, Darren Dale <dsdal...@gmail.com> wrote: > >> On Wed, Jun 3, 2009 at 12:08 PM, Phil Thompson < >> p...@riverbankcomputing.com> wrote: >> >>> On Wed, 03 Jun 2009 17:37:29 +0200, "V. Armando Solé" <s...@esrf.fr> >>> wrote: >>> > Hello, >>> > >>> > The problem can be solved as shown below. >>> > >>> > It seems the linux 32 bit implementation gets confused in >>> > createIndex(row, column, a) when a is not an integer but a long. With >>> > small values of a (10, 100, 1000), the indexId() method returns the >>> > supplied value. >>> > >>> > The solution is to call createIndex(row, column, a) with a being a >>> > python object and not its id. The indexId() method can be masked with a >>> > 32 bit mask if it returns a negative value. I have only found that >>> > misbehavior under linux 32bit. Windows XP and linux 64-bit behave >>> properly. >>> > >>> > Thanks for your time, >>> > >>> > Armando >>> > >>> > import PyQt4.Qt as qt >>> > import random >>> > import sys >>> > >>> > mask = 0xFFFFFFFF >>> > >>> > class Model(qt.QAbstractItemModel): >>> > def index(self, row, column, parent): >>> > a=[random.random()] >>> > index = self.createIndex(row, column, a) >>> > print "Next two values should be the same" >>> > returned = index.internalId() >>> > if returned < 0: >>> > returned = returned & mask >>> > print "indexInternalId = ", returned >>> > print "id(a) = ", id(a) >>> > print "Forcing to be the same with a 32 bit mask" >>> > print "indexInternalId = ", index.internalId() & mask >>> > print "id(a) = ", id(a) & mask >>> > return index >>> > >>> > if __name__ == "__main__": >>> > app = qt.QApplication([]) >>> > w = Model() >>> > w.index(0,0,None) >>> >>> Could you see if the problem goes away if you change >>> qabstractitemmodel.sip >>> so that... >>> >>> QModelIndex createIndex(int arow, int acolumn, int aid) const; >>> >>> ...is replaced by... >>> >>> QModelIndex createIndex(int arow, int acolumn, quint32 aid) const; >>> >> >> I applied this change to the 20090601 snapshot. Executive summary: when I >> check different data types, I can still find places where the two id's do >> not agree. I find disagreement with the mask applied and without: >> >> When I run the script I posted, I get output like: >> >> Next two values should be the same >> indexInternalId = 1849945336 >> id(a) = 139691366280440 >> >> If I apply Armando's mask, I get: >> >> Next two values should be the same >> indexInternalId = 12719168 >> id(a) = 12719168 >> >> If I remove the mask and instead do "a=[numpy.uint32(random.random())]", I >> get ouput like: >> >> Next two values should be the same >> indexInternalId = 12719168 >> id(a) = 12719168 >> >> Still without the mask, if I do "a=[numpy.int64(random.random())]": >> >> Next two values should be the same >> indexInternalId = 12719168 >> id(a) = 12719168 >> >> And finally, with Armando's mask and with >> "a=[numpy.int64(random.random())]": >> >> Next two values should be the same >> indexInternalId = 110072896 >> id(a) = 139754050917440 >> > > There was a bug report, it has been marked "won't fix": > http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=204226 > One last point, however: I think Armando's suggestion of passing the object, and not the object's id(), coupled with Phil's patch, is the right solution: import PyQt4.Qt as qt import random import sys import numpy class Model(qt.QAbstractItemModel): def index(self, row, column, parent): a=(random.random(),) index = self.createIndex(row, column, a) print "Next two values should be the same" print "indexInternalId = ", index.internalId() print "id(a) = ", id(a) a=(numpy.uint32(random.random()),) index = self.createIndex(row, column, a) print "Next two values should be the same" print "indexInternalId = ", index.internalId() print "id(a) = ", id(a) a=(numpy.uint64(random.random()),) index = self.createIndex(row, column, a) print "Next two values should be the same" print "indexInternalId = ", index.internalId() print "id(a) = ", id(a) return index if __name__ == "__main__": app = qt.QApplication([]) w = Model() w.index(0,0,None) With Phil's patch, running this script on 64-bit linux yields: Next two values should be the same indexInternalId = 8744016 id(a) = 8744016 Next two values should be the same indexInternalId = 8744080 id(a) = 8744080 Next two values should be the same indexInternalId = 8744016 id(a) = 8744016 Darren
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt