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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нехватает опыта, чтобы реализовать задумку  (Прочитано 5027 раз)
smackthat
Гость
« : Апрель 18, 2010, 10:57 »

Добрый день. Итак, я работаю с QWebKit. Я загружаю веб-страничку через QWebFrame функцией load. Потом я достаю содержание странички через функции для работы с дом-моделью (findFirst, FindAll). Так вот, я не могу просто сначала вызвать лоад, а потом findFirst, так как функция лоад выполняется паралельно, а чтобы достать ее содержимое нужно написать функцию, которая будет это делать по срабатыванию сигнала loadFinished (вроде так называется). Получается, чтобы достать содержимое странички нужно написать 2 функции при этом как их связать вместе я не знаю.

Я бы хотел, просто создать функцию, которая грузит какую-то страничку и возвращает ее содержимое.
На практике мне нужно грузить страничку, искать определенные строки и на основе этих строк обращатся к другим страничкам. В коде это выглядит примерно так:
Код:
void найтиКлючевыеСловаДляСтранички(адресСтранички)
{
     // достаем название странички
     for(для каждого слова названия странички)
     {
          // ищем ключевые слова для слова
     }
}

Тоесть я загружаю и получаю содержимое для кучи страничек, что в свою очередь требует выполнения 2 функций: загрузки странички и доставания инфы, которые не могут выполняться последовательно.

Если кто-то понял вопрос, буду очень рад услышать советы.
Записан
SABROG
Гость
« Ответ #1 : Апрель 18, 2010, 11:36 »

Ну и подключай к loadFinished свой слот, а там вызывай findFirst. Хуже если страничка может сама обновляться по яваскрипту или еще как-то. Тогда танцы с бубнами начнутся.
Записан
smackthat
Гость
« Ответ #2 : Апрель 18, 2010, 12:17 »

Я так и делаю, но проблема в том, что таких сигналов должно посылаться очень много и непонятно как управлять всем этим месивом из единственной функции, непонятно как определять, кто что послал и что следует искать в очередной страничке. Понимаете?
Записан
smackthat
Гость
« Ответ #3 : Апрель 18, 2010, 15:28 »

Я тут думал-думал и понял, что мне нужно, чтобы вместе с сигналом приходила и дополнительная информация, о том, что нужно делать.

Как передать какую-то информацию сигналу? Тоесть, чтоб сигнал видел, что ему нужно делать.
Записан
smackthat
Гость
« Ответ #4 : Апрель 19, 2010, 12:42 »

Попробую детальнее пояснить свою проблему: я хочу написать программу, которая делает примерно следующее:
Код:
for(int counter=0;counter<10;counter++)
{
     // 
     // загружаю страничку http://website.com/page/counter/
     // тоесть если counter==3, то загружаю http://website.com/page/3/
     // с этой странички я достаю ключевые слова и загоняю их в массив keywords
     // теперь для каждого ключевого слова я ищу странички
     for(int c=0; c<keywords.size(); c++)
    {
           // загружаю страничку http://google.com/search/query=keywords[c]
           // например: http://google.com/search/query=авто
           // достаю, то что мне нужно и перехожу к следующему ключевому слову
    }
}
Проблема тут заключается в том, что загрузка страничек происходит паралельно: тоесть покопаться в уже загруженной страничке я могу только по сигналу loadFinished. Но как обработчик сигнала может знать, что делать в загруженной страничке (ведь это может быть или http://website.com/page/3/ или http://google.com/search/query=авто). Поэтому я и хочу как-то передать дополнительную информацию, чтобы обработчик сигнала знал, что делать.
Записан
SABROG
Гость
« Ответ #5 : Апрель 19, 2010, 13:14 »

Куча способов. Самый простой QWebView::url().
Записан
smackthat
Гость
« Ответ #6 : Апрель 19, 2010, 15:07 »

Но как мне достать url?
Пытаюсь так:
Код:
QString url=(qobject_cast<QWebFrame *>(QObject::sender()))->url().toString();
Компилится нормально, но когда доходит до выполнения этой строки программа вылетает.
Записан
Kolobok
Гость
« Ответ #7 : Апрель 19, 2010, 16:49 »

Если делаешь qobject_cast, нужно проверять, что получилось.
Записан
smackthat
Гость
« Ответ #8 : Апрель 19, 2010, 18:09 »

Как можно проверить, что получилось?
Записан
Kolobok
Гость
« Ответ #9 : Апрель 19, 2010, 18:16 »

Код:
QWebFrame *sender= qobject_cast<QWebFrame *>( this->sender() );
if( sender )
{
  ...
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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