Qt-interest Archive, March 2008
QtScript and QVariants
Message 1 in thread
Niklas,
Thanks for your workaround for QVariants, but it seems it is not necessary.
I figured out that the Variant prototype has the method "valueOf()" to
retrieve the encapsulated data.
Given this QVariants from C++:
aEngine->globalObject().setProperty(
"stringVariant",
aEngine->newVariant(QString("foo")));
aEngine->globalObject().setProperty(
"boolVariant",
aEngine->newVariant(true));
aEngine->globalObject().setProperty(
"intVariant",
aEngine->newVariant(123));
In script code you can do:
var a = stringVariant;
print(typeof a); // variant
print(a); // variant(QString, foo)
var a2 = a.valueOf();
print(typeof a2); // string
print(a2); // foo
print();
var b = boolVariant;
print(typeof b); // variant
print(b); // variant(bool, true)
var b2 = b.valueOf();
print(typeof b2); // boolean
print(b2); // true
print();
var c = intVariant;
print(typeof c); // variant
print(c); // variant(int, 123)
var c2 = c.valueOf();
print(typeof c2); // number
print(c2); // 123
AFAIK the Variant.prototype description is missing in the docs.
Maybe Kent could add this at a time.
Regards, Acenes
> QScriptValue workaroundVariant2ScriptValue(QScriptEngine *e, QVariant var)
> {
> if(var.isNull())
> return e->nullValue();
>
> switch(var.type())
> {
> case QVariant::Invalid:
> return e->nullValue();
> case QVariant::Bool:
> return QScriptValue(e, var.toBool());
> case QVariant::Date:
> return e->newDate(var.toDateTime());
> case QVariant::DateTime:
> return e->newDate(var.toDateTime());
> case QVariant::Double:
> return QScriptValue(e, var.toDouble());
> case QVariant::Int:
> case QVariant::LongLong:
> return QScriptValue(e, var.toInt());
> case QVariant::String:
> return QScriptValue(e, var.toString());
> case QVariant::Time:
> return e->newDate(var.toDateTime());
> case QVariant::UInt:
> return QScriptValue(e, var.toUInt());
> }
>
> // bad but better then nothing
> return QScriptValue(e, var.toString());
>}
--
[ signature omitted ]