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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QWebView + javascript + выполнить функцию  (Прочитано 14368 раз)
bosfor
Гость
« : Февраль 01, 2012, 18:23 »

Ребят подскажите : Есть не6обходимость загрузить яваскрипт и юзать его функцию, но самое непонятное для меня (на форуме не нашел), ему надо передать бинарный параметр (QByteArray) и получить строковый (QString) результат.

Как загрузить и вызвать скрипт понятно- но как передать бинарные данные и получить ответ неясно ... Непонимающий

P.S: Может кто подскажет что получьше, но данный скрип должен AMF (Action Message Format) формат данных декодировать в строковое значение, других вариантов в сети не нашел. Тут буржуи пишут http://developer.qt.nokia.com/forums/viewthread/206
« Последнее редактирование: Февраль 03, 2012, 13:40 от bosfor » Записан
Bepec
Гость
« Ответ #1 : Февраль 01, 2012, 19:27 »

Код:
// имеем класс TST
// соединяем  страничку и наш класс.
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("TST", this);
// любой скрипт. (все функции класса можно вызывать через "TST")
tmp = "var divs=document.getElementsByTagName('li'); " 
"TST.allo(1, 2, 3, 4, 5, 6, 7, 8, 9); ";
// выполняем скрипт и получаем цифры от 1 до 9 в вызываемом слоте.
ui.webView->page()->mainFrame()->evaluateJavaScript(tmp);
Записан
bosfor
Гость
« Ответ #2 : Февраль 01, 2012, 22:40 »

Код:
tmp = 	"var divs=document.getElementsByTagName('li'); "  
"TST.allo(1, 2, 3, 4, 5, 6, 7, 8, 9); ";

что-то этот момент не уловил, как связаны первая и вторая строки ?

может это подойдет ?
void QWebView::setContent ( const QByteArray & data, const QString & mimeType = QString(), const QUrl & baseUrl = QUrl() )

вот только неясно как должны выглядеть бинарные данные внутри страницы если их туда поместить туда до выполнения скрипта ?
Записан
Bepec
Гость
« Ответ #3 : Февраль 02, 2012, 09:36 »

Связаны кучей кода,который я вырезал.
Твой класс может вызываться из ЯваСкрипта, ты это понимаешь, не? Улыбающийся
А вызванная функция может вернуть в Java любые данные, которые ты можешь поместить в переменную.
аля
Код:
QString TST::allo()
{return "be be be";}
//-- куча кода

tmp = "var divs= TST.allo(); ";
           "alert(divs);"
ui.webView->page()->mainFrame()->evaluateJavaScript(tmp);
// должен вывести строку "be be be"
Записан
bosfor
Гость
« Ответ #4 : Февраль 02, 2012, 12:08 »

что не получается, делаю так:

обозначаю свой класс который будет возвращать бинарные данные
Код:
class MyArray
{
public:
    QByteArray arr;
    QByteArray getArr()
    {
        return arr;
    }
};

далее удостоверившись что страница со скриптом загруженна делаю так:
Код:
MyArray myArray;
myArray.arr.append("123");
myView->page()->mainFrame()->addToJavaScriptWindowObject("myArray", this);
QVariant gg = myView->page()->mainFrame()->evaluateJavaScript("mytest()");
qDebug() << gg;

вернуться должен был размер массива но возращается путо
Код:
QVariant(, ) 

а вот сам ява скрипт
Код:
<script type="text/javascript">
function mytest()
{
   var i = 0;
   i = myArray.getArr();
   return i.length;
}
</script>

пробовал с текстом тоже не идет
Код:

class MyArray
{
public:
    QByteArray arr;
    QByteArray getArr()
    {
        return arr;
    }
    QString getStr()
    {
        return "vau !!!";
    }
};
« Последнее редактирование: Февраль 02, 2012, 13:02 от bosfor » Записан
Bepec
Гость
« Ответ #5 : Февраль 02, 2012, 22:57 »

Прикрепи давай архивчик с html'ом с нужной тебе функцией и функцией вывода строки.

PS в моей программе строки/числа спокойно вводятся в скрипт.

update: поглядел ещё раз на твой код. qDebug и qVariant дружат помоему только с четким указанием типа. Просто QVariant будет всегда выводить пустую строку.
Записан
bosfor
Гость
« Ответ #6 : Февраль 03, 2012, 09:36 »

попробовал модифицировать базовый пример formextractor.pro
передаю ему QByteArray а на явескрипте вывожу длинну массива и все как не феноменально работает Непонимающий
я делал все также кроме как в рабочем примере класс центрального виджета описывается отдельно а потом подгужается ....
но не думаю что это должно являться причиной..
Прямо магия какаето я уже под микроскопом сравнивал файлы проекта - зацепки нет .....
« Последнее редактирование: Февраль 03, 2012, 09:37 от bosfor » Записан
Bepec
Гость
« Ответ #7 : Февраль 03, 2012, 09:39 »

Выложи свою функцию ввода (или что она там у тебя делает, принимает, выводит.)

Или же выложи свой проект, тогда поковыряю палочкой и скажу, где не работает, а где поправить.

PS если уж проект коммерческий, али делиться не хошь, выложи на файлообменник с паролем, а мне ссыль в Личные Сообщения кинь. ^^
Записан
bosfor
Гость
« Ответ #8 : Февраль 03, 2012, 10:55 »

domtraversal - не работает
formextractor - работает
Записан
Bepec
Гость
« Ответ #9 : Февраль 03, 2012, 13:04 »

*В ужасе бьётся об стенку*

Что за проект? Как это работало? Куда это сувать?

Примерно такие у меня сейчас мысли, глядя на код твоего нерабочего проекта...
Записан
bosfor
Гость
« Ответ #10 : Февраль 03, 2012, 13:09 »

*В ужасе бьётся об стенку*

Что за проект? Как это работало? Куда это сувать?

Примерно такие у меня сейчас мысли, глядя на код твоего нерабочего проекта...

вопросы к разработчикам QT ))) это ведь их детище из примеров я только немного своего добавил ))

подозреваю что подвох от принципа наследования
class Window : public QMainWindow, private Ui::Window
но может я не прав ...
« Последнее редактирование: Февраль 03, 2012, 13:11 от bosfor » Записан
Bepec
Гость
« Ответ #11 : Февраль 03, 2012, 13:13 »

Это не от разработчиков Qt, это скорее кувалдой подогнанный квадрат, который по идее должен быть круглым Веселый
Записан
bosfor
Гость
« Ответ #12 : Февраль 03, 2012, 13:16 »

Это не от разработчиков Qt, это скорее кувалдой подогнанный квадрат, который по идее должен быть круглым Веселый
приведи хоть несколько моментов обработки кувалдой )) очень интересно где все началось не в ту сторону .......

и это я его еще привел к первоначальному варианту оставив только неработающие моменты сути вопраса ))

да, там я дублирую работу в видемом и скрытом QWebView, так как в дальнейшем мне надо будет использовать функцию декодирования в фоне
« Последнее редактирование: Февраль 03, 2012, 13:23 от bosfor » Записан
Bepec
Гость
« Ответ #13 : Февраль 03, 2012, 13:24 »

Как вариант у тебя были проблемы, из-за public: функции возврата QByteArray.
Функции, вызываемые в Java должны быть слотами (public slots:).


У тебя в проекте какая-то мешанина из стилей и функционала. Например тот же QNetworkAccess никуда не девшийся.

Сделал свой, чистенький, рабочий проект. Смотри, понимай, пользуйся
Записан
bosfor
Гость
« Ответ #14 : Февраль 03, 2012, 13:27 »

У тебя в проекте какая-то мешанина из стилей и функционала. Например тот же QNetworkAccess никуда не девшийся.

да заметил позже этот участок - забыл вырезать, в реальности я его использую для перехвата запросов

хоть и на скорую руку чтобы не заморачиваться, но код рабочий у этого класса
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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