Russian Qt Forum
Ноябрь 22, 2024, 06:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как зарегистрировать указательный тип в qScriptRegisterMetaType  (Прочитано 3173 раз)
Sacha_D
Гость
« : Апрель 24, 2013, 09:29 »

Здравствуйте.

h-файл.
Код:
namespace PFT3 {

class TaskEngine : public QObject {
Q_OBJECT
public:
void createInQScriptEngine(QScriptEngine &scriptEngine);
};

namespace PFT3_Tasks {

class LIBPFT3SHARED_EXPORT BaseData : public QObject {
        Q_OBJECT
};

class BaseDataScriptProto : public QObject, protected QScriptable {
        Q_OBJECT
};

}// end of namespace PFT3_Tasks

}//end of PFT3 namespace

Q_DECLARE_METATYPE(PFT3::PFT3_Tasks::BaseData)
Q_DECLARE_METATYPE(PFT3::PFT3_Tasks::BaseData*)
Q_DECLARE_METATYPE(const PFT3::PFT3_Tasks::BaseData*)

cpp-файл

Код:
QScriptValue PFT3TaskBaseDataToScriptValue(QScriptEngine *engine, PFT3::PFT3_Tasks::BaseData * const &in){
    return engine->newQObject(in, QScriptEngine::AutoOwnership);
}

void PFT3TaskBaseDataFromScriptValue(const QScriptValue &object, PFT3::PFT3_Tasks::BaseData * &out){
    out = qobject_cast<PFT3::PFT3_Tasks::BaseData*>(object.toQObject());
}

namespace PFT3 {

void TaskEngine::createInQScriptEngine(QScriptEngine &scriptEngine){
    /*Создаём единственный на весь scriptEngine процессор задач PFT3*/
    QScriptValue scriptTaskEngineObject = scriptEngine.newQObject(this);
    scriptEngine.globalObject().setProperty(nameInScript, scriptTaskEngineObject);
    /*Добавляем прототипы и конструкторы задач PFT3*/
    QScriptValue scriptTasksNamespace = scriptEngine.newQObject(new QObject(), QScriptEngine::ScriptOwnership);
    scriptEngine.globalObject().setProperty(scriptTasksNamespaceName, scriptTasksNamespace);
    /*BaseData*/
    PFT3_Tasks::BaseDataScriptProto *baseDataPrototypeObject = new PFT3_Tasks::BaseDataScriptProto (&scriptEngine);
    const QScriptValue baseDataProto = scriptEngine.newQObject(baseDataPrototypeObject, QScriptEngine::ScriptOwnership);
    scriptEngine.setDefaultPrototype(qMetaTypeId<PFT3::PFT3_Tasks::BaseData>(), baseDataProto);
    QScriptValue baseDataCtor = scriptEngine.newFunction(&PFT3_Tasks::BaseData::construct, baseDataProto);
    scriptEngine.globalObject().property(scriptTasksNamespaceName).setProperty("BaseData", baseDataCtor);

    /*-------------------------------------------------------------------------------------------------------*/
    qScriptRegisterMetaType(&scriptEngine, PFT3TaskBaseDataToScriptValue, PFT3TaskBaseDataFromScriptValue);//Вроде регистрирую.
    /*-------------------------------------------------------------------------------------------------------*/
   
}

}// end of namespace PFT3

Пишу на QtScript:

Код:
//delete task;
var task = new PFT3_Tasks.BaseData(1, 2, 6000, 2000, true);
pft3TaskEngine.appendTask(task);

Получаю:
Цитировать
Ошибка в сценарии привела к исключительной ситуации:
"TypeError: cannot call appendTask(): argument 1 has unknown type `PFT3_Tasks::BaseData*' (register the type with qScriptRegisterMetaType())"
при выполнении строки 3.
Стек вызовов:
1. <anonymous>()@Сценарий, введённый пользователем:3

http://lists.qt.nokia.com/public/qt-interest/2009-February/002051.html читал и через typedef пробовал.
Making Applications Scriptable тоже читал и не один раз.
Замучился уже.
Как правильно, подскажите пожалуйста?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 20.