Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: Авварон от Апрель 14, 2010, 23:30



Название: скрипт и типы
Отправлено: Авварон от Апрель 14, 2010, 23:30
Начал изучать qt скрипт
Должно ли работать такое (у меня не хочет):
Код:
MainWindow.centralWidget.webView.url =  MainWindow.centralWidget.lineEdit.text;
Судя по ассистанту вроде не очень, но почему такое:
Код:
print(MainWindow.centralWidget.webView.url);
работает? И можно ли без написания обертки для вебвью с пропертей урла-строкой реализовать изменение урла из скрипта
и собсно как сделать кастомное преобразование типов? видел подобное в ассистанте (где был геттер с наследником QObject но ща не могу найти)


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 15, 2010, 12:44
Работает, возможно, потому что qt script позволяет вызывать функции без аргументов без скобок (стандарт ecma script вроде бы это позволяет).

qthelp://com.trolltech.qt.460/qdoc/scripting.html
Вот такие строки:
Код:
obj = {};
 obj.__defineGetter__("x", function() { return this._x; });
 obj.__defineSetter__("x", function(v) { print("setting x to", v); this._x = v; });
 obj.x = 123;
, должны решить проблему. Не знаком с webView, но навскидку:
Код:
MainWindow.centralWidget.webView.__defineGetter("propUrl", function() {return this.url();});
MainWindow.centralWidget.webView.__defineSetter("propUrl", function(url) { this.setUrl(url);});


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 15, 2010, 15:09
ну сами геттеры\сеттеры регистрируются, толку-то?
даже если написать MainWindow.centralWidget.webView.setUrl(url); мы идем лесом:(


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 15, 2010, 19:26
А что setUrl не слот?
Тогда надо наследоваться и через Q_INVOKABLE|Q_SLOT переопределять методы.
И вообще есть qt script bindings generator, который к сожалению имеет минус монолитности.
После загрузки оберток qt классов, становяться доступными все открытые методы классов.


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 15, 2010, 20:19
setURl не слот, но урл помечена как проперти (ф-ия WRITE указана). Разве этого недостаточно?


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 16, 2010, 00:13
Достаточно. А собственно:
Код:
#include <QScriptTools>
QScriptEngine engine;
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
debugger.action(QScriptEngineDebugger::InterruptAction)->trigger();
И вывод ошибки, если не сложно?


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 16, 2010, 10:44
о, ваш код дебаггера работает:)
если пишем так:
Код:
    webView.setUrl(lineEdit.text);
то получаем
Код:
Uncaught exception at :/script.js:33: TypeError: Result of expression 'webView.setUrl' [undefined] is not a function.
если
Код:
    webView.url = lineEdit.text;
то ничего в дебаге не получаем, но оно не работает тем не менее


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 16, 2010, 11:44
А что должно работать? При установке url представление должно автоматически его загрузить и отобразить или еще что-нибудь сделать?

Для нахождения направления дальнейших исследований:
1. в c++ коде нужно попробовать:
Код:
webView.setProperty("url", lineEdit.property("text").toString());
2. в qt script коде всячески выводить значения переменных на чистую воду:
Код:
print(lineEdit.text);
print(webView.url);
Дебаггер не отключать.



Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 16, 2010, 13:59
1. пашет
2. пашет. Дебаггер молчит


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 16, 2010, 17:48
Поподробнее:)
Первый вариант должен работать, как если бы в c++ было вызывано QWebView::setUrl();
Второй вариант в Debug Output в qt script отладчике должен напечатать две строки.


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 16, 2010, 19:38
1й вариант загружает страницу, 2й печатает 2 строки:)
к примеру
http://ya.ru
about:blank


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 16, 2010, 21:54
Долго не мог понять зачем слово "типы" в теме. Не поленился полез глянул на тип свойства. Ба, да там же QUrl. И сразу все стало на свои места.
Значит по хорошему должно быть так:
Код:
MainWindow.centralWidget.webView.url =  new QUrl(MainWindow.centralWidget.lineEdit.text);
Но сразу скажу сделать для НЕ Q_OBJECT класса обертку для qt script сходу долго. Впринципе в ассистенте аналогичный пример о QByteArray обертке есть, но тогда уж лучше использовать QSBG, где обертки для qt классов сделаны. Поэтому будем работать как проще, все равно не известно чем все это кончиться. Сделаем функцию stringToUrl и занесем ее в qt script среду. Прошу прощения так как пишу сразу в форум, могут быть помарки.
Код:
QScriptValue stringToUrlWrapper(QScriptContext* context, QScriptEngine* engine)
{
  if (context->argumentCount() == 1)
    return engine->newVariant(new QUrl(context->argument(2).toString()));
  return engine->undefinedValue();
}
В инициализации qt script системы:
Код:
engine->globalObject().setProperty("stringToUrl", engine->newFunction(stringToUrlWrapper));
В qt script:
Код:
MainWindow.centralWidget.webView.url =  stringToUrl(MainWindow.centralWidget.lineEdit.text);
Загвозда изначальной проблемы наврено в том, что QVariant не умеет преобразовывать QString в QUrl.

P.S. Ну зато потрындели:)


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 17, 2010, 00:26
ну я в общем-то это и спрашивал) как у скрипта с левыми типами (конкретно QUrl). За код спасибо, попробую:)
added: прикольно:) только надо
Код:
return engine->newVariant(Url(context->argument(0).toString()));
а чтобы без ф-ии обертки, напрямую каст? это надо городить классы как в примере с прототипами?


Название: Re: скрипт и типы
Отправлено: asvil от Апрель 17, 2010, 10:25
Первый путь.
В инициализации qt script среды:
Код:
qScriptRegisterMetaType<QUrl>(engine, QUrlToScriptValue, QUrlFromScriptValue);
Просто где-то в c++:
Код:
 QScriptValue QUrlToScriptValue(QScriptEngine *eng, const QUrl &ba)
 {
     return eng->newVariant(ba);
 }

void QUrlFromScriptValue(const QScriptValue &obj, QUrl &ba)
 {
     ba = QUrl(obj.toString());
 }
Если qt script будет вызывать преобразование, то тогда проблема решиться. Иначе придеться создавать, наследовать, переопределять, вообщем пользоваться всеми благами C++ ООП. Если, тьфу-тьфу, это случиться, нужно понять что с++ ООП != ecma script ООП. А конкретнее, иерархия классов реализуется по разному. И, честно говоря, я может быть и не прав, но усматриваю в этом косяк троллей. Зачем соединять сложно соединяемое. Но это видимо сделано из соображений web ориентированности. Поэтому, если в проектах необходима среда сценариев, лучше ее делать неотличимой от C++. В частности, использовать python.


Название: Re: скрипт и типы
Отправлено: Авварон от Апрель 17, 2010, 12:00
да, такое тоже работает:) спасибо))