Поиск:

Ответ в темуСоздание новой темы Создание опроса
> метод в прототипе класса не работает, QScript 
:(
    Опции темы
htzg
Дата 6.12.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Всем здрасте!
Есть класс 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();
}



может пригодится!
PM MAIL   Вверх
htzg
Дата 10.12.2012, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



...либо ни кто не знает ответа, либо не хотят в коде разбираться...
Попробую (надеюсь поможет) конкретизировать вопрос:
можно в QSript (или это тонкости ECMAscript) передать ссылку на существующий объект (не синглтон)?

п.с.: подскажите кто что знает, может ссылку какую-нибудь где спросить/почитать. Принципиальный момент для меня, не могу с места сдвинуться... Спасибо за понимание!
п.с.с.: может "коряво" объясняю?  В таком случае спросите, я постараюсь внести ясность.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.