Russian Qt Forum

Qt => Вопросы новичков => Тема начата: hindsight от Август 23, 2012, 12:53



Название: QScriptValue::Undeletable
Отправлено: hindsight от Август 23, 2012, 12:53
Здравствуйте!
Подскажите пожалуйста, если кто знает.
Я использую модуль QtScript, мне нужно создать некоторое глобальное свойство (конкретнее, имя пользователя программы, от которого скрипт запущен), доступное скрипту во время его работы, но чтобы его нельзя было поменять никаким способом.
Пока я написал следующее:
Код
C
QScriptValue functionUSER(QScriptContext *context, QScriptEngine *engine)
{
if(context->isCalledAsConstructor() || context->argumentCount() != 0)
qDebug() << "INVALID CALL OF FUNCTION USER";
return QScriptValue("user");
}
...
int main(int argc, char **argv)
...
QScriptEngine engine;
engine.globalObject().setProperty("user", engine.newFunction(functionUSER), QScriptValue::PropertyGetter | QScriptValue::PropertySetter | QScriptValue::Undeletable);
 
Насколько я понял из документации, флаг Undeletable делает как раз то, что мне нужно. Но запуск простешей программы показывает, что я неправ:

Код
Javascript
print(user); // user
user = "root";
print(user); // user, everything is ok
delete user;
user = "root";
print(user); // root, after deleting any value can be assigned, totally not ok :(
 

Скажите, что я сделал не так? И есть ли способ создать такую скриптовую переменную - чтобы её нельзя никак было изменить или удалить.
Заранее спасибо.


Название: Re: QScriptValue::Undeletable
Отправлено: hindsight от Октябрь 18, 2012, 19:15
Неужели никто не сталкивался с подобной проблемой?


Название: Re: QScriptValue::Undeletable
Отправлено: lesav от Октябрь 19, 2012, 07:57
Использовать метод для взятия имени пользователя ?


    Q_PROPERTY(QString user READ user WRITE setUser)
    Q_INVOKABLE QString user (){ return m_user;}
    void setUser (QString u){ m_user = u;}


а в скрипте брать имя пользователя только используя метод

var js_user;
.....
if(js_user != qtObj.user ())
  return "Error autentification.";


К setUser() в скрипте доступности не будет т.к. он объявлен не INVOKABLE