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
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt