crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

id2606
  опции профиля:
сообщение 17.4.2013, 7:08
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 5.9.2012
Пользователь №: 3510

Спасибо сказали: 0 раз(а)




Репутация:   0  


В своем проекте я использую QWebPage.

Добавляю в него свой объект

m_scriptPage->mainFrame()->addToJavaScriptWindowObject("JSB", this);


в скрипте на странице вызываю функцию и указываю селектор например

    var e = JSB.findElements ("input");


Реализация

    QWebElement JSB::findElement (QString selector)
    {
        QWebElement doc = m_scriptPage->mainFrame()->documentElement ();
        return doc.findFirst();
    }


Если я ищу один элемент как в примере выше, то никаких проблем нет.
Но я никак не могу вернуть массив элементов!

если пытаюсь вернуть QWebElementCollection, то скрипт ругается что он не знает тип данных QWebElementCollection;
в QVariantList я не могу засунусь QWebElement.

Подскажите как мне вернуть массив элементов типа QWebElemnt и массив QObject* Так чтобы JavaScript на странице не ругался что он не знает что это такое.

Еще пытался вернуть другой свой объект типа

    class JSBElement : public QObject { ... }
     
     
    JSBElement JSB::getElement (QString selector)
    {
        QWebElement doc = m_scriptPage->mainFrame()->documentElement ();
        QWebElement e1 = doc.findFirst(selector);
     
        JSBElement e(e1);
        return e;
    }


JavaScript точно также ругался что не знает что такое JSBElement, но если вернуть JSBElement*, то все работает прекрасно.
Единственная проблема я не знаю когда мне можно удалять JSBElement.

    class JSBElement : public QObject { ... }
     
     
    QObject* JSB::getElement (QString selector)
    {
        QWebElement doc = m_scriptPage->mainFrame()->documentElement ();
        QWebElement e1 = doc.findFirst(selector);
     
        return new JSBElement (el);
    }


Вызовов функции из скрипта JSB.findElement может быть сколько угодно и работать скрипт может бесконечно, а значит память будет постоянно съедаться что недопустимо.

Подскажите как мне это все обойти и вообще в каком направлении рыть ? Вроде и вопрос простой, но не могу найти/сделать решение уже сутки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Гость_Гость_lanz_*_*
сообщение 17.4.2013, 15:11
Сообщение #2





Гости








    


Цитата
Я же не могу достучаться до QScriptEngine который находится в QWebFrame.

И действительно :lol:
Цитата
In general its advised to use care when passing QObjects as arguments, as those objects don't become owned by the JavaScript engine; That means that the application developer has to be extra careful not to try to access QObjects that have already been deleted by the native environment.


Вопрос на засыпку. Почему не использовать JavaScript(document.getElement...) чтобы траверсить DOM?

Раскрывающийся текст
Не получается авторизоваться, прошу прощения :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.6.2025, 1:23