Development/Tutorials/Kross/Call Functions in Kross
This tutorial shows how to deal with functions provided by a script. It builds upon the Kross Hello World tutorial.
The source files
This tutorial is based on the Hello World tutorial and extends the codebase we wrote there with new functionality.
CMakeLists.txt
We are using cmake to build our small sample project. The CMakeLists.txt file looks like;
project (krosshello)
find_package(KDE4 REQUIRED)
include_directories( ${KDE4_INCLUDES} )
set(krosshello_SRCS main.cpp mainwindow.cpp)
kde4_add_executable(krosshello ${krosshello_SRCS})
target_link_libraries(krosshello ${KDE4_KDEUI_LIBS} ${KDE4_KROSSUI_LIBS})
main.cpp
The main.cpp does create the sample application and shows the mainwindow instance.
- include <QString>
- include <KApplication>
- include <KAboutData>
- include <KMessageBox>
- include <KCmdLineArgs>
- include <KLocalizedString>
- include "mainwindow.h"
int main (int argc, char *argv[]) {
// Used to store information about a program.
KAboutData aboutData("krosshello",
0,
ki18n("Kross Hello World"),
"1.0",
ki18n("Hello World application for Kross"),
KAboutData::License_GPL,
ki18n("(c) 2007"),
ki18n("Some text..."),
"http://kross.dipe.org",
"[email protected]");
// Access to the command-line arguments.
KCmdLineArgs::init( argc, argv, &aboutData );
// Initialize the application.
KApplication app;
// Create and show the main window.
MainWindow* window = new MainWindow();
window->show();
// Finally execute the application.
return app.exec();
}
mainwindow.h
- ifndef MAINWINDOW_H
- define MAINWINDOW_H
- include <QComboBox>
- include <QLabel>
- include <QLineEdit>
- include <kross/core/action.h>
// The main window to display our combobox and the label.
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent=0);
private Q_SLOTS:
// This slot is called when the item in the combobox is changed.
void interpreterActivated(const QString &);
private:
QLineEdit* txtInputString;
QLabel* lblMessage;
QComboBox* cmbInterpreters;
Kross::Action* action;
};
- endif
mainwindow.cpp
- 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 and publish some
// QObject instances.
action = new Kross::Action(this, "MyScript");
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 &strSelectedInterpreter)
{
// this time we are using external script files.
// at this sample we are only using JavaScript but
// other supported backends will work well too.
if(strSelectedInterpreter != "javascript") {
lblMessage->setText("-");
return;
}
// set the script file that should be executed
action->setFile("Testscriptfile.js");
// execute the scripting code, i.e. preload
action->trigger();
// now we can call arbitrary functions
QVariantList arguments;
// here we pass in the QLineEdit instance as argument.
QVariant v;
v.setValue( (QWidget*) txtInputString );
arguments << v;
// and the second argument is a string
arguments << "Hello World";
// Call the function
QVariant result = action->callFunction("reverseString", arguments);
// Use the returnvalue of the function call
lblMessage->setText(result.toString());
}
Testscriptfile.js
The following JavaScript file does provide us the reverseString function. This function will be executed at the mainwindow.cpp file.
function reverseString(lineedit, s)
{
println("reverseString lineedit=" + lineedit + " s=" + s);
lineedit.setText("Text to reverse: " +s);
//MyInputString.text = "Text to reverse: " +s;
return s.split("").reverse().join("");
}