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.
Contents |
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})
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", "submit@bugs.kde.org");
// 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(); }
// 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; };
// 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()); }