Convert QVariantList to QList<Type> list
-
mmmm, You're right.
So I suggest to create a
template
methodThis code works for me
template <typename T> QSet<T> mergeList(const QVariantList& l1, const QVariantList& l2) { QSet<T> s1, s2; for (const QVariant& v: l1) { s1.insert(v.value<T>()); } for (const QVariant& v: l2) { s2.insert(v.value<T>()); } return s1 & s2; }
Used as
QVariantList l1, l2; l1 << 1 << 2 << 3; l2 << 1 << 3 << 5; QSet<int> s1 = mergeList<int> (l1, l2); qDebug() << s1; l1.clear(); l2.clear(); l1 << "Foo" << "Bar"; l2 << "Bar" << "Fred"; QSet<QString> s2 = mergeList<QString> (l1, l2); qDebug() << s2;
-
-
You can also implement qHash for the type you need to support and thus it will be used automatically in all your software.
#include <QtDebug> inline uint qHash(const QVariant &key, uint seed = 0) { switch (key.userType()) { case QVariant::Int: return qHash(key.toInt(), seed); case QVariant::UInt: return qHash(key.toUInt(), seed); // add all cases you want to support; } return 0; } int main( int argc, char * argv[] ) { QApplication app( argc, argv ); QVariantList vl1; QVariantList vl2; for (int i = 0 ; i < 5 ; ++i) { vl1 << i; } for (int i = 0 ; i < 3 ; ++i) { vl2 << i; } qDebug() << (vl1.toSet() & vl2.toSet()); return 0; }