Russian Qt Forum

Qt => Общие вопросы => Тема начата: smackthat от Апрель 18, 2010, 10:57



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

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

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

Если кто-то понял вопрос, буду очень рад услышать советы.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: SABROG от Апрель 18, 2010, 11:36
Ну и подключай к loadFinished свой слот, а там вызывай findFirst. Хуже если страничка может сама обновляться по яваскрипту или еще как-то. Тогда танцы с бубнами начнутся.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: smackthat от Апрель 18, 2010, 12:17
Я так и делаю, но проблема в том, что таких сигналов должно посылаться очень много и непонятно как управлять всем этим месивом из единственной функции, непонятно как определять, кто что послал и что следует искать в очередной страничке. Понимаете?


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: smackthat от Апрель 18, 2010, 15:28
Я тут думал-думал и понял, что мне нужно, чтобы вместе с сигналом приходила и дополнительная информация, о том, что нужно делать.

Как передать какую-то информацию сигналу? Тоесть, чтоб сигнал видел, что ему нужно делать.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: smackthat от Апрель 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=авто). Поэтому я и хочу как-то передать дополнительную информацию, чтобы обработчик сигнала знал, что делать.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: SABROG от Апрель 19, 2010, 13:14
Куча способов. Самый простой QWebView::url().


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: smackthat от Апрель 19, 2010, 15:07
Но как мне достать url?
Пытаюсь так:
Код:
QString url=(qobject_cast<QWebFrame *>(QObject::sender()))->url().toString();
Компилится нормально, но когда доходит до выполнения этой строки программа вылетает.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: Kolobok от Апрель 19, 2010, 16:49
Если делаешь qobject_cast, нужно проверять, что получилось.


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: smackthat от Апрель 19, 2010, 18:09
Как можно проверить, что получилось?


Название: Re: Нехватает опыта, чтобы реализовать задумку
Отправлено: Kolobok от Апрель 19, 2010, 18:16
Код:
QWebFrame *sender= qobject_cast<QWebFrame *>( this->sender() );
if( sender )
{
  ...
}