The main.cpp does create the sample application and shows the mainwindow instance.

The main.cpp does create the sample application and shows the mainwindow instance.

−

<code cpp>

+

<syntaxhighlight lang="cpp">

#include <QString>

#include <QString>

#include <KApplication>

#include <KApplication>

Line 54:

Line 54:

return app.exec();

return app.exec();

}

}

−

</code>

+

</syntaxhighlight>

=== mainwindow.h ===

=== mainwindow.h ===

Line 60:

Line 60:

This is the main windows class which defines some displayed widgets for our small sample application.

This is the main windows class which defines some displayed widgets for our small sample application.

−

<code cpp>

+

<syntaxhighlight lang="cpp">

#ifndef MAINWINDOW_H

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#define MAINWINDOW_H

Line 87:

Line 87:

#endif

#endif

−

</code>

+

</syntaxhighlight>

=== mainwindow.cpp ===

=== mainwindow.cpp ===

Line 93:

Line 93:

The implementation of the main window functionality. We are displaying a QLineEdit that will be passed as first argument to a scripting function named "reverseString". Those function returns a string that will then displayed in a QLabel. Just like at the [[Development/Tutorials/Kross/Hello World|Kross Hello World]] tutorial, we also display a QComboBox that does allow to choose an interpreter.

The implementation of the main window functionality. We are displaying a QLineEdit that will be passed as first argument to a scripting function named "reverseString". Those function returns a string that will then displayed in a QLabel. Just like at the [[Development/Tutorials/Kross/Hello World|Kross Hello World]] tutorial, we also display a QComboBox that does allow to choose an interpreter.

−

<code cpp>

+

<syntaxhighlight lang="cpp">

#include "mainwindow.h"

#include "mainwindow.h"

#include <QVBoxLayout>

#include <QVBoxLayout>

Line 133:

Line 133:

// this time we are using external script files.

// this time we are using external script files.

QString filename;

QString filename;

−

if(intpr == "python") // Python backend

+

if(interpr == "python") // Python backend

filename = "Testscriptfile.py";

filename = "Testscriptfile.py";

−

else if(intpr == "javascript") // JavaScript backend

+

else if(interpr == "javascript") // JavaScript backend

filename = "Testscriptfile.js";

filename = "Testscriptfile.js";

else { // no other sample script files

else { // no other sample script files

Line 173:

Line 173:

lblMessage->setText(result.toString());

lblMessage->setText(result.toString());

}

}

−

</code>

+

</syntaxhighlight>

== The Script Files ==

== The Script Files ==

Line 183:

Line 183:

The Testscriptfile.js JavaScript file does provide us the reverseString scripting function.

The Testscriptfile.js JavaScript file does provide us the reverseString scripting function.

−

<code javascript>

+

<syntaxhighlight lang="javascript">

function reverseString(lineedit, s)

function reverseString(lineedit, s)

{

{

Line 194:

Line 194:

return s.split("").reverse().join("");

return s.split("").reverse().join("");

}

}

−

</code>

+

</syntaxhighlight>

=== Testscriptfile.py ===

=== Testscriptfile.py ===

Line 200:

Line 200:

The Testscriptfile.py Python file does provide us the reverseString scripting function.

The Testscriptfile.py Python file does provide us the reverseString scripting function.

−

<code python>

+

<syntaxhighlight lang="python">

def reverseString(lineedit, s):

def reverseString(lineedit, s):

print "reverseString lineedit=%s s=%s" % (lineedit,s)

print "reverseString lineedit=%s s=%s" % (lineedit,s)

Line 206:

Line 206:

lineedit.setText(s)

lineedit.setText(s)

return s[::-1]

return s[::-1]

−

</code>

+

</syntaxhighlight>

Latest revision as of 10:19, 30 June 2011

This tutorial shows how to deal with functions provided by a script. This tutorial is based on the Hello World tutorial and extends the codebase we wrote there with new functionality to outline how calling scripting functions could be done.

Please note, that it is recommed to use Autoconnected Signals and Slots if you just like to have a bunch of scripting functions within a script that should be called on demand. That way you have a clear interface with signals that are mapped transparent to scripting functions. The "trick" here is, that Kross will automaticly connect each signal a QObject has to a matching scripting function and at the C++ side all what is
needed is to emit a signal and behind the scene the arguments will be
translated and a possible defined scripting function got called. A good example here is SuperKaramba which uses the signal+slot rather then callFunction() way. All it defines is the rather huge class that inherits QObject (karambainterface.h). The signals within that class are transparent mapped to scripting functions (e.g. template.py and template.js) while the slots are then callable from within the scripting code.
Signals and slots are faster and more type-safe then the in this tutorial used callFunction() (see also the Kross::Action class).

The implementation of the main window functionality. We are displaying a QLineEdit that will be passed as first argument to a scripting function named "reverseString". Those function returns a string that will then displayed in a QLabel. Just like at the Kross Hello World tutorial, we also display a QComboBox that does allow to choose an interpreter.

#include "mainwindow.h"#include <QVBoxLayout>#include <QDebug>#include <kross/core/manager.h>#include <kross/core/action.h>// the constructor.
MainWindow::MainWindow(QWidget *parent): QWidget(parent){
txtInputString =new QLineEdit();
lblMessage =new QLabel("Hello");
cmbInterpreters =new QComboBox ();
cmbInterpreters->addItem("Choose Interpreter", "");
foreach(QString s, Kross::Manager::self().interpreters())
cmbInterpreters->addItem(s);
connect(cmbInterpreters, SIGNAL(activated(const QString &)),
SLOT(interpreterActivated(const QString &)));
QVBoxLayout *vLayout =new QVBoxLayout;
vLayout->addWidget(cmbInterpreters);
vLayout->addWidget(txtInputString);
vLayout->addWidget(lblMessage);
setLayout(vLayout);// Create the Kross::Action instance .
action =new Kross::Action(this, "MyScript");// We don't need to publish any QObject instances// for this sample.//action->addObject(txtInputString, "MyInputString");//action->addObject(cmbInterpreters, "MyInterpreter");//action->addObject(lblMessage, "MyLabel");}// this slot is called when the active item of the combobox changes.void MainWindow::interpreterActivated(const QString &interpr){// this time we are using external script files.
QString filename;if(interpr =="python")// Python backend
filename ="Testscriptfile.py";elseif(interpr =="javascript")// JavaScript backend
filename ="Testscriptfile.js";else{// no other sample script files
lblMessage->setText("-");return;}// set the script file that should be executed
action->setFile(filename);// execute the scripting code, i.e. preload// please note, that it's needed to trigger aka// execute the script before calling a function// using callFunction() or before asking what// functions are available using functionNames().// also it's only needed to trigger the script// once and then call whatever functions should// be called or signals emitted or whatever.
action->trigger();// The list of arguments passed to the function
QVariantList args;// here we pass in the QLineEdit instance// as first argument
QVariant v;
v.setValue((QWidget*) txtInputString );
args << v;// and the second argument is a string
args <<"Hello World";// Call the arbitrary function
QVariant result = action->callFunction("reverseString",args);// Use the returnvalue of the function call
lblMessage->setText(result.toString());}

We are then able to use supported scripting backends like Python, Ruby and JavaScript to execute a scripting function named "reverseString" and called in the mainwindow.cpp file. The "reverseString" function has a QLineEdit and a QString as arguments and returns a QString.