Details
-
Task
-
Resolution: Done
-
P3: Somewhat important
-
None
-
None
-
01fb843af88d949cd38b494a60bb64b730a045d2
Description
Sometimes a QVariant can contain a container, such as QList<int>. Methods taking the QVariant as an argument may want to iterate over the content without knowing exactly which type of container it is, or what its element_type is (as long as that element_type is also defined as a metatype). Both QtDBus and QtScript have particular systems for doing this. Something in QtCore might be suitable. It might also have consequences for the (currently awkward QDeclarativeListProperty class)
One proposal would be to have API and function like this:
int main(int argc, char **argv)
{
QList<QVector<int> > listVec;
QVariant var = QVariant::fromValue(listVec);
qDebug() << "The variant" << var;
QVariantIterator itr = var.begin();
QVariantIterator end = var.end();
while (itr != end)
{
qDebug() << "List element" << *itr;
QVariantIterator itr2 = (*itr).begin();
QVariantIterator end2 = (*itr).end();
while (itr2 != end2)
++itr;
}
}
// Output:
// The variant QVariant(QList<QVector<int> >, )
// List element QVariant(QVector<int>, )
// Vector element QVariant(int, 3)
// Vector element QVariant(int, 7)
// Vector element QVariant(int, 8)
// List element QVariant(QVector<int>, )
// Vector element QVariant(int, 6)
// Vector element QVariant(int, 5)
// Vector element QVariant(int, 4)
That would involve adding typedefs and function pointers to QVariant::Handler for getting begin and end iterators in the container and for getting a particular element at a position.
An alternative API might be possible without putting the begin() and end() methods on the QVariant class.