Trolltech Home | Qt-interest Home | Recent Threads | All Threads | Author | Date
All threads index page 1

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 ]