2010-06-03 16 views
1

J'ai des problèmes pour accéder au contenu des objets QNetworkReply. Le contenu semble être vide ou nul. D'après les docs (traduction de C++ en java), je pense que je l'ai mis en place correctement, mais en vain. De plus, une "erreur inconnue" est signalée.Qt Jambi: Accès au contenu de QNetworkReply

Des idées très appréciées. 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(); 
    } 

} 
+1

Vous vous demandez simplement pourquoi avez-vous besoin de page Web quand vous pouvez faire la même chose avec seulement QNetworkAccessManager? – Anton

+0

@Anton: J'utilise la page web pour 2 raisons: 1) il me donne tous les atouts requis par la page (css, js, images - y compris ceux en css) et 2) car j'ai besoin du rendu html. –

+0

@Richard: Pourquoi pas QWebView? – Anton

Répondre

3

J'imagine que le QWebPage a déjà interrogé tous les QNetworkReply objets comme ils sont venus dans la documentation disent

QNetworkReply est un accès séquentiel QIODevice, ce qui signifie qu'une fois les données est lu à partir de l'objet, il n'est plus conservé par l'appareil. Il est donc la responsabilité de l'application à de conserver ces données si nécessaire.

donc la réinitialisation ne va pas fonctionner.

Notez que si vous effectuez la demande réseau directement via QNetworkAccessManager, vous obtenez un QNetworkReply avec des données disponibles. Vous obtenez seulement un pour l'URL réelle tandis que l'approche QWebPage télécharge tout le reste après que ce soit des images, js, etc.

+0

oui, je veux tout téléchargé, d'où l'approche de la page Web. Mais oui, je pense que vous avez raison, ils ont déjà été lus. Alors que faire .... –

+0

@Richard: Je suppose que cela dépend de quelles données vous avez besoin. Si 'QWebPage' les a traitées, il est probable que certaines informations seront disponibles. Peut-être que ce n'est pas pratique pour toi? – Troubadour

+0

Je suis après les images dans la page - à la fois l'image/données elle-même (pour l'analyse) ainsi que des informations de rendu comme la position dans la page, la visibilité et ainsi de suite. D'où l'approche de la page Web. J'espère juste essayer d'éviter de télécharger les images deux fois car je vais traiter beaucoup de pages. –