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 and extends that tutorial where needed.
The source files
CMakeList.txt
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
- 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:
// The constructor.
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;
// We now have the action as class-member.
Kross::Action* action;
};
- endif
mainwindow.cpp
- include "mw.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);
// This time we create the Kross::Action already within the
// constructor and add the objects that should be accessible
// from within scripting code.
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)
{
if(strSelectedInterpreter.isEmpty()) {
lblMessage->setText("-");
return;
}
// this time we are using external script files.
QString filename;
if(strSelectedInterpreter == "python")
filename = "krossSigsSlots.py";
else if(strSelectedInterpreter == "javascript")
filename = "krossSigsSlots.js";
else
return;
// set the script file that should be executed.
action->setFile(filename);
// finally execute the scripting code, i.e. preload
action->trigger();
// now we can call arbitrary functions
QVariantList arguments;
QVariant v;
v.setValue( (QWidget*) txtInputString );
arguments << v;
arguments << "Hello World";
QVariant result = action->callFunction("reverseString", arguments);
lblMessage->setText(result.toString());
}