QtScript 103
Now we can create widgets and load .ui files, we can take the time to fix a few other things. Initially, we could create widgets, but we couldn't specify their parents. Handling this is quite a small change:
QScriptValue UiUtils::createWidget(QScriptContext *context, QScriptEngine *engine) { if ( context->argumentCount() > 1 ) return context->throwError("Load takes one argument"); QWidget *parent = 0; if ( context->argumentCount() ) { parent = qscript_cast<QWidget*>(context->argument(0)); if ( !parent ) return context->throwError("The argument to load should be a QWidget"); } QString self = context->callee().property( "functionName" ).toString(); QUiLoader loader; QWidget *w = loader.createWidget( self, parent ); return engine->scriptValueFromQObject( w ); }
The new code first checks that the arguments are ok and throws an exception to the script if they're not. If a parent has been passed, we convert it to a QWidget * using qscript_cast. Finally, we use the parent or 0 when we call createWidget().
To let you layout widgets created like this nicely, I've also added support for creating QHBox and QVBox widgets. This means that code like:
var xx = new QHBox(); var yy = new QTextEdit(xx); var zz = new QPushButton(xx); xx.show();Will create a Q3HBox and layout the edit field and the button for us. The qscript_cast call is particularly useful as it gives us a clean way to convert the javascript value stored in the parameter into a C++ object.
The code for this version is available at http://xmelegance.org/devel/qscriptdemo3.tar.gz.