Convert QVariantList to QList<Type> list
-
Hi and thanks
How do I declare QSet<Type> at compile time when I dont know Type
Thanks
-
What is your use case ?
-
Hi
I need to compare two variantlist both containing variants of the same type and determine the variants that are common to both lists
Thanks
-
You can use
QVariant
directly without conversion because QVariant supportsoperator==()
-
QVariant has the == operator
-
No, use the QSet features e.g.
QSet<QVariant> commonSet = mySet1 & mySet2;
-
QSet
is based on a hash table; this means that internally it uses qHash() -
@ikim why not use QVariant::Type method? even you can use it with c++ template.
-
Which kind of error?
-
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;
-
Hi,
I'm not a C++ super-guru but I don't think you can do it because the compiler must know the type of each variable at compile time.
A solution could be implement
qHash(const QVariant &v)
and useQSet<QVariant>
-
12/23