[Interest] 64-bit internal ID for QModelIndex?
Bo Thorsen
bo at fioniasoftware.dk
Wed Aug 22 10:04:49 CEST 2012
Den 21-08-2012 20:55, Stephen Chu skrev:
> Is there a way to store a 64-bit internal ID in QModelIndex? The
> function QModelIndex::internalId() returns a 64-bit number but there's
> no way to put one in. The constructor takes only a 32-bit integer.
Hi Stephen,
Please forget all ideas of using the internal pointer. Don't EVER use that!
Instead, create a user role for your model and in the data() method you
check if this is that role and return your pointer. Something like this
would do:
class MyModel : public QAbstractListModel {
enum MyRoles { MyRole = UserRole }
QVariant data(index, role) {
if (role == DisplayRole) {
return mItems[index.row()].first;
} else if (role == MyUserRole) {
return mItems[index.row()].second;
}
return QVariant();
}
QList<QPair<QString, qint64>> mItems;
};
When you have an index to the model, you can now access your ID with this:
index.data(MyRole).value<qint64>();
This is written from memory, so you will have to fill in the blanks. And
you will probably do a more reasonable datatype than a pair with string
and ID :) But I hope you get the picture.
This is The Right Way(TM) to do *any* kind of extra data role in a model.
I know a lot of people want to use the internal pointer to store stuff
in, but I will argue any day that if someone uses this, they are doing
it wrong.
If you have pointers to objects in your model, then store those pointers
in a QList instead. Yes, it's a few more bytes of memory, but it removes
so many problems and potential crashes.
If you have a tree model, maybe we can discuss this. But for all flat
tables and lists, I'm not going to accept any kind of argument for using
the internal pointer :)
Bo Thorsen,
Fionia Software.
--
Expert Qt and C++ developer for hire
Contact me if you need expert Qt help
http://www.fioniasoftware.dk
More information about the Interest
mailing list