Не удается получить доступ к общедоступным слотам из QtScript

У меня есть этот класс:

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 {}

Но это тоже не имеет значения.


person jviotti    schedule 15.01.2013    source источник


Ответы (1)


Вам нужно создать QScriptClass вместо QObject. Qt содержит пример того, как расширить возможности скрипта в Qt. Взгляните на Пример пользовательского класса скрипта

person Kamil Klimek    schedule 16.01.2013
comment
Я не могу создать QScripClass: ** ошибка: тип «QScriptClass» не является прямой основой для «JavaScript» ** - person jviotti; 16.01.2013
comment
Ссылка на пример мертва - вы имели в виду этот пример - qt-project. org/doc/qt-4.8/script-customclass.html ? - person Joris Timmermans; 20.02.2013