Всем здрасте! Есть класс ScriptClass: scriptclass.h | Код | #ifndef SCRIPTCLASS_H #define SCRIPTCLASS_H
#include <QObject> #include <QMetaType> #include <QMap>
class ScriptClass : public QObject { Q_OBJECT public: explicit ScriptClass(double value=-999.999); ScriptClass(const ScriptClass &sc);
signals:
public:
void setValue(double value); double value() const; double &vr();
void addSc(QString name, const ScriptClass &sc); void removeSc(QString name); ScriptClass &sc(QString name);
private: double myValue; QMap<QString,ScriptClass*> myScs; };
Q_DECLARE_METATYPE(ScriptClass) Q_DECLARE_METATYPE(ScriptClass*)
#endif // SCRIPTCLASS_H
|
scriptclass.cpp | Код | #include "scriptclass.h"
ScriptClass::ScriptClass(double value) : QObject(0) { myValue = value; }
ScriptClass::ScriptClass(const ScriptClass &sc) { this->myValue = sc.myValue; this->myScs = sc.myScs; }
void ScriptClass::setValue(double value) { myValue = value; }
double ScriptClass::value() const { return myValue; }
double &ScriptClass::vr() { return *&myValue; }
void ScriptClass::addSc(QString name, const ScriptClass &sc) { if (!myScs.contains(name)) { ScriptClass *newSc = new ScriptClass(sc); myScs.insert(name,newSc); } }
void ScriptClass::removeSc(QString name) { if(myScs.contains(name)) { ScriptClass *sc = myScs.value(name); delete sc; myScs.remove(name); } }
ScriptClass &ScriptClass::sc(QString name) { return *myScs[name]; }
|
Для него создал прототип: scriptclassprototype.h | Код | #ifndef SCRIPTCLASSPROTOTYPE_H #define SCRIPTCLASSPROTOTYPE_H
#include <QObject> #include <QScriptable> #include <QScriptValue> #include <QScriptEngine>
#include "scriptclass.h"
class ScriptClassPrototype : public QObject, public QScriptable { Q_OBJECT public: explicit ScriptClassPrototype(QObject *parent = 0); public slots: void setValue(double value); double value(); double &vr(); void addSc(QString name, const ScriptClass &sc); void removeSc(QString name); ScriptClass &sc(QString name);
private: ScriptClass *wrappedScriptClass() const; };
#endif // SCRIPTCLASSPROTOTYPE_H
|
scriptclassprototype.cpp | Код | #include "scriptclassprototype.h"
ScriptClassPrototype::ScriptClassPrototype(QObject *parent) : QObject(parent) { }
void ScriptClassPrototype::setValue(double value) { wrappedScriptClass()->setValue(value); }
double ScriptClassPrototype::value() { return QScriptValue( wrappedScriptClass()->value() ).toNumber(); }
double &ScriptClassPrototype::vr() { return wrappedScriptClass()->vr(); }
ScriptClass *ScriptClassPrototype::wrappedScriptClass() const { return qscriptvalue_cast<scriptClass*>(thisObject()); }
void ScriptClassPrototype::addSc(QString name, const ScriptClass &sc) { wrappedScriptClass()->addSc(name,sc); }
void ScriptClassPrototype::removeSc(QString name) { wrappedScriptClass()->removeSc(name); }
ScriptClass &ScriptClassPrototype::sc(QString name) { return wrappedScriptClass()->sc(name); }
|
и конструктор: scripclassconstructor.h | Код | #ifndef SCRIPTCLASSCONSTRUCTOR_H #define SCRIPTCLASSCONSTRUCTOR_H
#include <QScriptValue> #include <QScriptContext> #include <QScriptEngine>
#include "scriptclass.h"
QScriptValue scriptClassConstructor(QScriptContext *context, QScriptEngine *engine);
#endif // SCRIPTCLASSCONSTRUCTOR_H
|
scriptclassconstructor.cpp | Код | #include "scriptclassconstructor.h"
QScriptValue scriptClassConstructor(QScriptContext *context, QScriptEngine *engine) { if (context->argumentCount() == 1 ) { QVariant var = context->argument(0).toVariant();
if (var.canConvert<scriptClass>()) return engine->toScriptValue( ScriptClass(var.value<scriptClass>()) ); else if (var.canConvert<double>()) return engine->toScriptValue( ScriptClass(var.toDouble()) ); } return engine->toScriptValue( ScriptClass() ); }
|
Далее все это подцепил в engine, а engine в свою очередь в debugger. Но не все работает так, как я задумывал... Работает как нужно: var a = new ScriptClass(); var b = new ScriptClass(); a.value; b.value; a.setValue; b.setValue; var c = new ScriptClass(a); a.addSc(b); Не работает так как мне нужно: typeof a.vr() // undefined typeof a.sc("b") // undefined Подскажите в чем проблема. Вообще хочу что бы можно было в скрипте писать выражения типа: var a = new ScriptClass(); var b = new ScriptClass(); a.addSc("b";b); a.sc("b").setValue(1.123); // <<<<<<<<!!!!!!!!! Спасибо! Добавлено через 6 минут и 36 секундa.value(); b.value(); a.setValue(); b.setValue(); Добавлено через 11 минут и 58 секунд| Код | #include <QtGui/QApplication>
#include <QtScriptTools> #include <QScriptEngine>
#include <scriptclass.h> #include <scriptclassconstructor.h> #include <scriptclassprototype.h>
int main(int argc, char *argv[]) { QApplication a(argc, argv); QScriptEngineDebugger debugger; QScriptEngine engine; // ScriptClassPrototype scProto; QScriptValue qsScProto = engine.newQObject(&scProto); engine.setDefaultPrototype(qMetaTypeId<scriptClass>(), qsScProto);
QScriptValue qsScConstructor = engine.newFunction(scriptClassConstructor, qsScProto); engine.globalObject().setProperty("ScriptClass", qsScConstructor); // debugger.attachTo(&engine); debugger.standardWindow()->show(); return a.exec(); }
|
может пригодится!
|