[C++/Lua/Qt] Lua Funktion aufrufen

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich habe hier ein Problem mit einem Programm und komme einfach nicht darauf, was falsch ist. Ich habe schon versucht, in diversen IRC-Channels Hilfe zu finden, leider konnte mir keiner helfen.
Das ganze ist relativ schwer zu beschreiben, aber ich versuche es einfach mal.

In mainwindow.cpp wird
Code:
lFunc *temp = new lFunc(label);
funcMap.insert(pair<QString, lFunc *>(label, temp));
connect(button, SIGNAL(clicked()), funcMap[label], SLOT(run()));
aufgerufen.
Z. 1: lFunc ist eine Klasse:
Code:
class lFunc: public QObject
{
Q_OBJECT
public:
    lFunc(QString,  QObject* parent = 0);
    lFunc(QObject *parent = 0): QObject(parent) {}
public slots:
    void run();

private:
    QString funcName;
};

Z. 2: funcMap ist ein Map mit QString und lFunc * .
Z. 3: Hier wird der jeweilige Knopf mit dem Slot run() verbunden
Code:
void lFunc::run()
{
    lua_pushstring(MainWindow::script.get(), funcName.toAscii());
    lua_gettable(MainWindow::script.get(), LUA_GLOBALSINDEX);
    lua_pushnil(MainWindow::script.get()); //funktioniert auch ohne nicht
    if(lua_pcall(MainWindow::script.get(), 1, 0, 0)!=0)
    {
        QString info = lua_tostring(MainWindow::script.get(), -1);
        std::cout<<"error running function "<<funcName.toStdString()<<": "<<info.toStdString()<<std::endl;
    }
}

Hier ein Beispiel Skript:
Code:
require "mylib"
function getsin(x)
	mylib.PushButton("new", 23, 23)
	mylib.PushButton("next", 1, 1)
	mylib.LineEdit("test: ", 2, 2)
	return mylib.example(x)
end

function new_clicked()
	mylib.PushButton("made from new", 23, 24)
end

getsin(x) ist eine in C geschriebene Funktion und funktioniert.
Wenn ich
Code:
new_clicked()
einfach im Skript aufrufe, so funktioniert auch das.
Das Problem ist nur, dass wenn es über run() aufgerufen werden sollte, der Fehler
error running function new_clicked: attempt to call a nil value
entsteht.
Versuchsweise habe ich luaL_dostring(L, "new_clicked()") versucht, funktionierte aber auch nicht.

MainWindow::script.get() gibt lua_State* zurück, das funktioniert auch, da ich lua_State *F = MainWindow::script.get(); ausgeführt habe und es - soweit ich das im Debugger sehe - einen richtigen Wert bekommt.
script ist ein statischer Member von MainWindow:
Code:
static Script script;
Es hat eine Methode get(), das wie oben beschrieben lua_State* zurückgibt.


Kann mir jemand weiterhelfen?

Gruß,

badday





EDIT:
Problem gelöst. Ich hatte intelligenter weise nicht das statische Script - Objekt benutzt. Ob es nur daran lag, kann ich aber nicht sicher sagen.
 
Zuletzt bearbeitet: (Übersichtlichkeit verbessert)
Zurück
Oben