Qt Jambi: доступ к содержимому QNetworkReply - PullRequest
1 голос
/ 03 июня 2010

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

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

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 Ответ

3 голосов
/ 03 июня 2010

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

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

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

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

...