Я пытаюсь реализовать возможность сценария существующего приложения QT.
Он отлично работает, но некоторые функции моего класса возвращают TypeError.
Myclass.h (действительно упрощенный):
class Myclass: public QObject
{
Q_OBJECT
public slots:
int firstfunction() const;
int secondfunction() const;
private:
int m_firstResult;
int m_secondResult;
}
Мой класс.cpp:
int Myclass::firstfunction() const
{
return m_firstResult;
}
int Myclass::secondfunction() const
{
return m_secondResult;
}
Главный :
Myclass qtObjectClass();
QScriptEngine scriptEngine;
QScriptValue qValue= scriptEngine.newQObject(&qtObjectClass);
Q_ASSERT (qtObjectClass.isQObject());
scriptEngine.globalObject().setProperty("QTscriptEngine", qValue);
QFile file("testScript.js");
file.open(QIODevice::ReadOnly);
QScriptValue result = scriptEngine.evaluate(file.readAll());
if(result.toString() != "undefined")
std::cout << result.toString().toStdString() << std::endl;
file.close();
if (scriptEngine.hasUncaughtException())
{
int lineNo = scriptEngine.uncaughtExceptionLineNumber();
printf("lineNo : %i", lineNo);
}
Сценарий :
print(QTscriptEngine.firstfunction());
print(QTscriptEngine.secondfunction());
И (странный) результат:
5
TypeError: Result of expression 'QTscriptEngine.secondfunction' [1] is not a function.
Где 5 — результат firstfunction(), а [1] — результат secondfunction().
Конечно, результат моей функции не является функцией, это вполне нормально, не так ли?
Я не понимаю, почему один работает, а другой нет (но оценивается, потому что [1] явно является хорошим возвращаемым значением secondfunction())
(Я действительно упростил весь код, и, возможно, проблема исходит из другого места, но это явно странно)
Есть идеи ? Спасибо.
QObject
в сценарии, система метаобъектов должна знать об этом. Это означает, что в вашем примере методы должны быть объявлены какslots
илиQ_INVOKABLE
для вызова. И что такоеQTscriptEngine
? ПосколькуQScriptEngine
имеет методыfirstfunction()
иsecondfunction()
. - person cmannett85   schedule 28.11.2013Q_OBJECT
не определяет все методы какQ_INVOKABLE
, но я пропустил ваше объявлениеslots
, извините. - person cmannett85   schedule 28.11.2013