У меня есть этот класс:
class JavaScript : public QObject {
Q_OBJECT
public:
JavaScript();
bool executeFromFile(QString file);
bool enabled;
public slots:
void setEnabled( bool enabled );
bool isEnabled() const;
private:
QScriptEngine engine;
};
Методы определяются следующим образом:
#include "javascript.h"
JavaScript::JavaScript() {
executeFromFile("test.js");
}
bool JavaScript::executeFromFile(QString file) {
QFile scriptFile(file);
if (!scriptFile.open(QIODevice::ReadOnly)) return false;
QTextStream stream(&scriptFile);
QString contents = stream.readAll();
scriptFile.close();
engine.evaluate(contents, file);
return true;
}
void JavaScript::setEnabled( bool enabled ) {
JavaScript::enabled = enabled;
}
bool JavaScript::isEnabled() const {
return enabled;
}
Я пытаюсь получить доступ к общедоступным слотам, ранее определенным в заголовочном файле, как сказано в документации:
http://doc.qt.digia.com/qt/scripting.html#making-ac-object-available-to-scripts-writing-in-qtscript
Файл test.js выглядит так же, как и примеры документации:
var obj = new JavaScript();
obj.setEnabled( true );
print( "obj is enabled: " + obj.isEnabled() );
Но я ничего не получаю. Кажется, он не находит объект JavaScript. Что мне не хватает?
Выполнение простого
print(1+1)
работает просто отлично.
EDIT: пример в Веб-страница qt4 реализует Q_PROPERTY. Я попробовал это, но получил тот же результат:
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
EDIT 1: Попытался реализовать инициализатор следующим образом:
// javascript.h:
JavaScript(QObject *parent = 0);
// javascript.cpp:
JavaScript::JavaScript(QObject *parent) : QObject(parent) {}
Еще ничего...
EDIT 2: Некоторые примеры также наследуются от QScriptable
:
class JavaScript : public QObject, public QScriptable {}
Но это тоже не имеет значения.