Frage

Ich habe Probleme, auf den Inhalt von QNetworkRep -Objekten zugreifen zu können. Inhalt scheint leer oder null zu sein. Laut den Dokumenten (Übersetzung von C ++ zu Java) habe ich glaube, dass ich dieses Richtige richtig eingerichtet habe, aber ohne Erfolg. Zusätzlich wird ein "unbekannter Fehler" gemeldet.

Alle Ideen sehr geschätzt. Code:

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();
    }

}
War es hilfreich?

Lösung

Ich stelle mir vor, dass die QWebPage hat bereits alle befragt QNetworkReply Objekte als sie kamen. Die Dokumente sagen

Qnetworkreply ist ein sequentielles access qiodevice, was bedeutet, dass nach dem Lesen von Daten aus dem Objekt nicht mehr vom Gerät aufbewahrt wird. Es liegt daher in der Verantwortung der Anwendung, diese Daten beizubehalten, wenn sie benötigt werden.

Das Zurücksetzen wird also nicht funktionieren.

Beachten Sie, dass wenn Sie die Netzwerkanforderung direkt durchstellen QNetworkAccessManager Sie bekommen eine QNetworkReply mit verfügbaren Daten. Sie bekommen jedoch nur einen für die tatsächliche URL, während die QWebPage Herangehensweise lädt alles andere danach herunter, dh Bilder, JS usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top