Здравствуйте.
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 (http://lists.qt.nokia.com/public/qt-interest/2009-February/002051.html) читал и через typedef пробовал.
Making Applications Scriptable тоже читал и не один раз.
Замучился уже.
Как правильно, подскажите пожалуйста?