TypeError с использованием QTScript в приложении C++

Я пытаюсь реализовать возможность сценария существующего приложения 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())

(Я действительно упростил весь код, и, возможно, проблема исходит из другого места, но это явно странно)

Есть идеи ? Спасибо.


person MokaT    schedule 28.11.2013    source источник
comment
Я не понимаю код, который вы разместили, чтобы использовать что-либо из QObject в сценарии, система метаобъектов должна знать об этом. Это означает, что в вашем примере методы должны быть объявлены как slots или Q_INVOKABLE для вызова. И что такое QTscriptEngine? Поскольку QScriptEngine имеет методы firstfunction() и secondfunction().   -  person cmannett85    schedule 28.11.2013
comment
Макрос Q_OBJECT определил, что функции моего класса Q_INVOKABLE, нет? И мои слоты объявлены в «общедоступных слотах:». Я добавил свой main, чтобы лучше понять мое приложение и что такое QTScriptEngine.   -  person MokaT    schedule 28.11.2013
comment
Нет, макрос Q_OBJECT не определяет все методы как Q_INVOKABLE, но я пропустил ваше объявление slots, извините.   -  person cmannett85    schedule 28.11.2013


Ответы (1)


Ответ был глупым. У меня были свойства, определенные следующим образом:

Q_PROPERTY(int m_firstResult READ firstfunction)

Функция, находящаяся в Q_PROPERTY, возвращает TypeError. И я даже не указал свои свойства в своем вопросе, поэтому никто не смог ответить на мой вопрос, извините за это.

person MokaT    schedule 29.11.2013