2010-06-03 4 views
1

У меня возникли проблемы с доступом к содержимому объектов QNetworkReply. Содержимое кажется пустым или нулевым. Согласно документам (перевод с C++ на java), я думаю, что у меня это настроено правильно, но безрезультатно. Кроме того, сообщается «Неизвестная ошибка».Qt Jambi: Доступ к содержимому QNetworkReply

Любые идеи очень ценятся. Код:.

public class Test extends QObject { 

    private QWebPage page; 

    public Test() { 

     page = new QWebPage(); 

     QNetworkAccessManager nac = new QNetworkAccessManager(); 
     nac.finished.connect(this, "requestFinished(QNetworkReply)"); 

     page.setNetworkAccessManager(nac); 

     page.loadProgress.connect(this, "loadProgress(int)"); 
     page.loadFinished.connect(this, "loadFinished()"); 

    } 

    public void requestFinished(QNetworkReply reply) { 

     reply.reset(); 
     reply.open(OpenModeFlag.ReadOnly); 

     reply.readyRead.connect(this, "ready()"); // never gets called 

     System.out.println("bytes: " + reply.url().toString()); // writes out asset uri no problem 
     System.out.println("bytes: " + reply.bytesToWrite()); // 0 
     System.out.println("At end: " + reply.atEnd()); // true 
     System.out.println("Error: " + reply.errorString()); // "Unknown error" 
    } 

    public void loadProgress(int progress) { 
     System.out.println("Loaded " + progress + "%"); 
    } 

    public void loadFinished() { 
     System.out.println("Done"); 
    } 

    public void ready() { 
     System.out.println("Ready"); 
    } 

    public void open(String url) { 
     page.mainFrame().load(new QUrl(url)); 
    } 

    public static void main(String[] args) { 

     QApplication.initialize(new String[] { }); 

     Test t = new Test(); 
     t.open("http://news.bbc.co.uk"); 

     QApplication.exec(); 
    } 

} 
+1

Просто интересно, зачем вам нужна веб-страница, когда вы можете сделать то же самое только с QNetworkAccessManager? – Anton

+0

@ Антон: Я использую веб-страницу по двум причинам: 1) он дает мне все активы, необходимые для страницы (css, js, images - в том числе в css) и 2) cos Мне нужен html-рендеринг. –

+0

@ Рихард: Почему бы не QWebView? – Anton

ответ

3

Я полагаю, что QWebPage уже опрошена все QNetworkReply объекты, как они пришли в Документах сказать

QNetworkReply является последовательным доступом QIODevice, что означает, что когда данные считывается с объекта, оно больше не находится . Поэтому ответственность за применение сохранит эти данные, если это необходимо.

поэтому сброс не будет работать.

Обратите внимание, что если вы делаете сетевой запрос напрямую через QNetworkAccessManager, вы получаете QNetworkReply с доступными данными. Вы получаете только один, хотя для фактического URL-адреса, тогда как метод QWebPage загружает все остальное после этого, то есть изображения, js и т. Д.

+0

да, я хочу, чтобы все загрузилось, следовательно, подход к веб-странице. Но да, я думаю, вы правы, их уже прочитали. Итак, что делать .... –

+0

@ Рихард: Я думаю, это зависит от того, какие данные вам нужны. Если 'QWebPage' обработал их, то предположительно часть информации будет доступна из него. Может быть, это не практично, хотя для вас? – Troubadour

+0

Я за изображениями на странице - как сам образ/данные (для анализа), так и рендеринг информации, такой как позиция на странице, видимость и т. Д. Следовательно, подход к веб-странице. Я просто надеюсь попытаться избежать загрузки изображений дважды, так как я собираюсь обрабатывать много страниц. –

Смежные вопросы