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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWebView различные траблы а также вывод в него ХТМЛ  (Прочитано 6452 раз)
Dimych
Гость
« : Июль 13, 2011, 19:09 »

Всем привет. версия QT 4.5

Пытаюсь написать программулину, которая будет через проксю принимать и отправлять данные на вконтакте c помощью GET и POST.
Ок, с прокси сервером разобрался, как принять данные методом get разобрался. Не могу разобраться с тем что происходит в QWebView.

1. Например, если использовать webView->setUrl("http://vkontakte.ru/"); Отлично - загружает страницу как надо и вообще всё красиво, однако после загрузки страницы падает из-за ошибки приложения "память не может быть written". Это не сильно важно, т.к. я думаю что это баг QT, но может кто сталкивался.

2. (код ниже)Получаю ответ сервера с помощью QNetworkAccessManager методом get, также я пробовал QHttp. По сигналу readyRead() обрабатываю ответ. потом webView->setHtml(data) для загрузки в виджет QWebView также сливаю ответ сервера в файл. Отлично, приложение не падает, зато теперь не работает ни один стиль CSS который загружается из файла в тегах <head></head> и я так подозреваю что javascript тоже не пашет.

    Т.е получается что документ загружается но, все подключаемые файлы нет, в итоге на странице нет картинок, стилей, не работают скрипты, это голая     ХТМЛ страница. Но это еще не всё, пробовал я это для http://vkontakte.ru/login.php для яндекса, еще для чего-то. Но, например, http://beinmusic.ru/, тут вообще в выходном файле кусок кода конца страницы, а начала кода нет, также без стилей и без всего.

3. Кодировка в QWebView при загрузке страницы с помощью setHtml. Вместо русских букв кракозябры. Я решил эту проблему с помощью QTextCodec, но может есть другой способ - сам ответ сервера ведь приходит в нормальной форме

Если все мои проблемы просто потому, что у меня старая версия, а в новых уже всё давно окей работает, то просветите меня пожалуйста об этом:)

Также пример исходного кода, той части которая отвечает за сетевую работу.

Код:
MAINWINDOW.CPP

//use proxy
 QNetworkProxy proxy;
 proxy.setType(QNetworkProxy::HttpProxy);
 proxy.setHostName("10.12.51.72");
 proxy.setPort(8080);
 QNetworkProxy::setApplicationProxy(proxy);
//----------------------

//create http request
/*ask = new QHttp;
  QUrl url;

QHttpRequestHeader header( "GET", "http://www.yandex.ru/yandsearch?text=Fucking peoples" );
ask->setHost( "yandex.ru" );
ask->request( header );*/
//ask->setHost("yandex.ru")*/
/*
url.setUrl("http://www.vkontakte.ru/login.php");
ask->setProxy(proxy);
ask->setHost("vkontakte.ru");
ask->get(url.path());*/

 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 reply = manager->get(QNetworkRequest(QUrl("http://beinmusic.ru/")));

 QObject::connect(reply, SIGNAL(readyRead()),this,SLOT(httpRequestFinished()));
//QObject::connect(ask, SIGNAL(done( bool)),this, SLOT(httpRequestFinished( bool)));
//connect buttons

void MainWindow::httpRequestFinished(){

    if(!reply){
        QMessageBox::information(this, "22", reply->error() + "\n" + reply->errorString(), QMessageBox::Ok);
    }
    else
    {
       // QString str;
        QByteArray data = this->reply->readAll();
        //QTextCodec *codec = QTextCodec::codecForName("CP1251");
        //str = codec->toUnicode(data);
        ui->webView->setHtml(data);

        QFile sl("fck.html");
        sl.open(QIODevice::WriteOnly);
        sl.write(data);
    }
}

Записан
sendevent
Гость
« Ответ #1 : Июль 13, 2011, 20:16 »

по существу мало чего скажу - во-первых, много читать, во-вторых - давно не возился.
webView->setHtml(data) - скармливай не только хтмл, но и урл, относительно которого должна быть загрузка скриптов/стилей и пр. внешних ресурсов.
по коду:
Код:
if(!reply){
        QMessageBox::information(this, "22", reply->error() + "\n" + reply->errorString(), QMessageBox::Ok);
    }
ты убеждаешься, что указатель невалиден и пытаешься его использовать.
вообще, есть сигнал QNetworkAccessManager::finished - юзай его, отпадет необходимость хранить указатель на риплай.
кодировка - приходит и/или в хттп-пакете, и/или в теле хтмл-документа, могут отличаться. если QWebKit, по какой-то причине, обрабатывает не правильно - QTextCodec, на мой взгляд, верное решение.
не задавай кучу вопросов в одном топике - в такой каше разбираться не каждый захочет.
Записан
Dimych
Гость
« Ответ #2 : Июль 14, 2011, 03:36 »

Йахууу, всё заработало, и даже без вбития URL в setHtml, sendevent ты был прав, действительно нужно было поставить сигнал finished. Очень странно потому что мне казалось что я его до этого пробовал. Еще QWebView тормозной, яндекс еле открыл.

Еще проблемка - некоторые страницы UTF8, некоторые CP1251, как мне кодек менять в зависимости от того какая страница? Есть какой-то способ?

и с этой строчкой я совсем забыл. !reply у меня щас стоит чтобы else выполнялось:
Код:
f(!reply){
        QMessageBox::information(this, "22", reply->error() + "\n" + reply->errorString(), QMessageBox::Ok);
    }
Тут я пытался сделать проверку на ошибки. Этот код остался от вызова слота по сигналу от QHttp - тогда reply был просто переменной bool. Как мне сделать проверку, была ли ошибка при обращении к серверу или при получении ответа?
« Последнее редактирование: Июль 14, 2011, 03:38 от Dimych » Записан
sendevent
Гость
« Ответ #3 : Июль 14, 2011, 14:50 »

отлов ошибок - как-то так:
Код:
void SomeReceiver::slotRequestFinished( QNetworkReply *pReply )
{
    if( pReply )
    {
        m_lastError = pReply->error(); //-- it's a QNetworkReply::NetworkError
        
        m_strLastError = tr( "%1 (Error code %2)" )
            .arg( pReply->errorString().toUtf8().data() )
            .arg( pReply->error() );
        
        if( QNetworkReply::NoError != m_lastError
            &&
                ( !pReply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).isNull()
                    && pReply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt() != 200
                ) )
        {
            qWarning() << "SomeReceiver::slotRequestFinished" << m_strLastError << m_sitePtr->getMsgTitle();
            /*qDebug() << "request was:";
            showRequest( &pReply->request() );
            qDebug() << "reply is:";
            showReply( pReply );*/
        }
else
{
   //-- process reply:
   ...
}
    }
    else
    {
      initLastError(); //-- default error notification
    }
}
естесственно, под себя адаптируешь сам - код ответа "не 200" это не всегда ошибка, может понадобиться ручная обработка переадресаций и т.п. - код просто как пример, думаю поймешь куда копать.
про кодировку - к сожалению, кода под рукой нету, но там тоже все довольно интуитивно понятно. вообще, вебкит сам без проблем все разруливает в большинстве случаев, скорее всего проблема где-то у тебя - может, кодек для апп не тот стоит (QTextCodec::setCodecForTr( QTextCodec::codecForName( "UTF-8" ) )Подмигивающий, или текст без tr(...) выводишь, или еще чего. кодировку можно действительно выдерать из ответа/контента и устанавливать через QTextCodec, но это, все-таки, на крайняк.
***
кстати, по поводу тормознутости кувебкит - естесственно, десктопным браузерам проигрывает, где-то больше, где-то меньше, но в общем и целом - довольно шустрая штука, при таких богатых возможностях можно потерпеть. а вот сайт яндекса, как "тестовая площадка днс, пинга и рунета вообще" действительно плохо себя ведет с ним - помнится, что-то у них было с жабоскриптом, грузил проц неимоверно.
« Последнее редактирование: Июль 14, 2011, 14:55 от sendevent » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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