Seite 1 von 1

QScript / Q_INVOKABLE Überladene text() Funktion

Verfasst: 13. Juli 2009 16:30
von Chris81T
Hallo,

aktuell nutze ich QScript. Soweit klappt auch alles wunderbar. Ich mache die C++ Objekte via Property der ScriptEngine bekannt, so dass man aus dem Script heraus auf die C++ Objekte drauf zugreifen kann.

Alle Funktionen, die als public slots zur Verfügung stehen, können auch direkt aus der Script Umgebung angesprochen werden.

Für alle anderen public eigenen Funktionen, die keine Slots sind, kann man das Macro Q_INVOKABLE verwenden, was auch funktioniert.


Nur zur Problemstellung:

Beispielcode:

Code: Alles auswählen

...
class ScriptLineEdit : public QLineEdit
{
public:
    Q_INVOKABLE QString text() const {return QLineEdit::text();}
...
};
Was habe ich damit vor:

Ich habe eine solche Klasse, die neben speziellen Funktionen auch schon vorhandene Funktionen der QLineEdit Klasse der Scriptumgebung bekannt machen soll. Da man schlecht in der QLineEdit Klasse das Q_INVOKABLE hinzufügen kann, ist mein Gedanke, diese zu überladen und in der überladenen Funktion die von der QLineEdit stammende Funktion aufzurufen.

Leider funktioniert dies nicht, denn dann erscheint zur Laufzeit folgende Fehlermeldung von der QScriptEngine:
Engine1 has uncaught exception: TypeError: text is not a function
Die Fehlermeldung stammt von der QScriptEngine Funktion uncaughtException().toString()

Nun gut, ich könnte die Funktion auch in getText() beispielsweise umbenennen, denn damit funktioniert es, aber event. kann man oben beschriebene Konstellation erfüllen, damit die Namensbezeichnung gleich bleiben kann. Hat jemand eine Idee?

Verfasst: 13. Juli 2009 20:52
von upsala
Was hindert dich daran, alle Methoden als Slots zu betrachteen? Außer daß es komisch aussieht.

Irgendwie ist QtScript auch etwas schwierig zu verstehen...

Verfasst: 14. Juli 2009 08:57
von Chris81T
Nun gut, die Funktionen werden nicht als Slots benötigt und in der Qt Doku ist es so dokumentiert...

http://doc.trolltech.com/4.5/qtscript.h ... n-qtscript

...das man das Macro Q_INVOKABLE nutzen soll. Das Problem bleibt auch weiterhin bestehen, wenn die überladene text() Funktion als Slot definiert wird. Wie gesagt, wenn der Funktionsname zur überladenen Funktion variiert (zB getText), dann funktioniert es.