crossplatform.ru

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


  Ответ в Массив QWebElement
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Гость_lanz_* Дата 17.4.2013, 15:11
 
Цитата
Я же не могу достучаться до 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?

Раскрывающийся текст
Не получается авторизоваться, прошу прощения :(
id2606 Дата 17.4.2013, 13:20
 
Цитата(lanz @ 17.4.2013, 11:53) *
Объекты, наследуемые от QObject копировать нельзя.
Поэтому вот это:
QObject* JSB::getElement (QString selector)
    {
        QWebElement doc = m_scriptPage->mainFrame()->documentElement ();
        QWebElement e1 = doc.findFirst(selector);
    
        return new JSBElement (el);
    }

Правильное решение.
Для того чтобы объекты удалялись GC движка нужно выставить им Script Ownership.
Как сделать это, читайте здесь:
http://qt-project.org/doc/qt-4.8/scripting...bject-ownership


Так я не могу понять где указывать Script Ownership
Я же не могу достучаться до QScriptEngine который находится в QWebFrame.
lanz Дата 17.4.2013, 11:53
  Объекты, наследуемые от QObject копировать нельзя.
Поэтому вот это:
QObject* JSB::getElement (QString selector)
    {
        QWebElement doc = m_scriptPage->mainFrame()->documentElement ();
        QWebElement e1 = doc.findFirst(selector);
    
        return new JSBElement (el);
    }

Правильное решение.
Для того чтобы объекты удалялись GC движка нужно выставить им Script Ownership.
Как сделать это, читайте здесь:
http://qt-project.org/doc/qt-4.8/scripting...bject-ownership
id2606 Дата 17.4.2013, 11:24
 
Цитата(lanz @ 17.4.2013, 10:59) *
Чтобы засунуть в QVariant надо выполнить Q_DECLARE_METATYPE.
Чтобы свой кастомный объект, qScriptRegisterMetatype.
Про время жизни QObject читать тут http://qt-project.org/doc/qt-4.8/scripting...bject-ownership


Q_DECLARE_METATYPE (JSBElement) я конечно же сделал
А вот как заставить движек JavaScript видеть мой объект JSBElement не знаю.
Он на него всеравно ругается. А что бы зарегить его в пространстве ScriptEngine в JavaScript нужно сначала получить доступ к нему. А его нигде не дают. Другие пути еще не нашел. Сделал все через обертку.

Как засунуть свой объект в QVariantList я разобрался

Достаточно сделать так

QVariantList JSBPageObject::findElements(QString selector)
{
    QVariantList list;

    foreach (QWebElement e, m_webPage->findAllElements(selector))
        list.append(QVariant::fromValue(e));

    return list;
}



lanz Дата 17.4.2013, 10:59
  Чтобы засунуть в QVariant надо выполнить Q_DECLARE_METATYPE.
Чтобы свой кастомный объект, qScriptRegisterMetatype.
Про время жизни QObject читать тут http://qt-project.org/doc/qt-4.8/scripting...bject-ownership
id2606 Дата 17.4.2013, 7:08
  В своем проекте я использую 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 может быть сколько угодно и работать скрипт может бесконечно, а значит память будет постоянно съедаться что недопустимо.

Подскажите как мне это все обойти и вообще в каком направлении рыть ? Вроде и вопрос простой, но не могу найти/сделать решение уже сутки.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:17