Russian Qt Forum
Ноябрь 22, 2024, 17:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: скрипт и типы  (Прочитано 12097 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Апрель 14, 2010, 23:30 »

Начал изучать qt скрипт
Должно ли работать такое (у меня не хочет):
Код:
MainWindow.centralWidget.webView.url =  MainWindow.centralWidget.lineEdit.text;
Судя по ассистанту вроде не очень, но почему такое:
Код:
print(MainWindow.centralWidget.webView.url);
работает? И можно ли без написания обертки для вебвью с пропертей урла-строкой реализовать изменение урла из скрипта
и собсно как сделать кастомное преобразование типов? видел подобное в ассистанте (где был геттер с наследником QObject но ща не могу найти)
Записан
asvil
Гость
« Ответ #1 : Апрель 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);});
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Апрель 15, 2010, 15:09 »

ну сами геттеры\сеттеры регистрируются, толку-то?
даже если написать MainWindow.centralWidget.webView.setUrl(url); мы идем лесом:(
Записан
asvil
Гость
« Ответ #3 : Апрель 15, 2010, 19:26 »

А что setUrl не слот?
Тогда надо наследоваться и через Q_INVOKABLE|Q_SLOT переопределять методы.
И вообще есть qt script bindings generator, который к сожалению имеет минус монолитности.
После загрузки оберток qt классов, становяться доступными все открытые методы классов.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Апрель 15, 2010, 20:19 »

setURl не слот, но урл помечена как проперти (ф-ия WRITE указана). Разве этого недостаточно?
Записан
asvil
Гость
« Ответ #5 : Апрель 16, 2010, 00:13 »

Достаточно. А собственно:
Код:
#include <QScriptTools>
QScriptEngine engine;
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
debugger.action(QScriptEngineDebugger::InterruptAction)->trigger();
И вывод ошибки, если не сложно?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Апрель 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;
то ничего в дебаге не получаем, но оно не работает тем не менее
Записан
asvil
Гость
« Ответ #7 : Апрель 16, 2010, 11:44 »

А что должно работать? При установке url представление должно автоматически его загрузить и отобразить или еще что-нибудь сделать?

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

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Апрель 16, 2010, 13:59 »

1. пашет
2. пашет. Дебаггер молчит
Записан
asvil
Гость
« Ответ #9 : Апрель 16, 2010, 17:48 »

Поподробнее:)
Первый вариант должен работать, как если бы в c++ было вызывано QWebView::setUrl();
Второй вариант в Debug Output в qt script отладчике должен напечатать две строки.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Апрель 16, 2010, 19:38 »

1й вариант загружает страницу, 2й печатает 2 строки:)
к примеру
http://ya.ru
about:blank
Записан
asvil
Гость
« Ответ #11 : Апрель 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. Ну зато потрындели:)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Апрель 17, 2010, 00:26 »

ну я в общем-то это и спрашивал) как у скрипта с левыми типами (конкретно QUrl). За код спасибо, попробую:)
added: прикольно:) только надо
Код:
return engine->newVariant(Url(context->argument(0).toString()));
а чтобы без ф-ии обертки, напрямую каст? это надо городить классы как в примере с прототипами?
« Последнее редактирование: Апрель 17, 2010, 00:37 от Авварон » Записан
asvil
Гость
« Ответ #13 : Апрель 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.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Апрель 17, 2010, 12:00 »

да, такое тоже работает:) спасибо))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.165 секунд. Запросов: 23.