2010-06-03 2 views
1

QNetworkReply 개체의 내용에 액세스하는 데 문제가 있습니다. 콘텐츠가 비어 있거나 0 인 것으로 보입니다. 워드 프로세서 (C++에서 자바로 변환)에 따르면 올바르게 설정 한 것 같지만 아무 소용이 없습니다. 또한 "알 수없는 오류"가보고되고 있습니다.Qt Jambi : QNetworkReply의 내용에 액세스

모든 아이디어를 많이 감사합니다. 코드 :. 나는 그들이 들어와 QWebPage 이미 모든 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

@Anton : 저는 2 가지 이유 때문에 웹 페이지를 사용하고 있습니다. 1) 페이지에 필요한 모든 애셋을 제공합니다 (CSS, js, 이미지 - CSS 포함). 2) 렌더링 된 html이 필요합니다. –

+0

@ 리차드 : 왜 QWebView가 필요하지 않습니까? – Anton

답변

3

워드 프로세서

QNetworkReply는 의미 순차 액세스 QIODevice, 말하는 데이터 번 객체에서 읽으면 더 이상 이 장치에 보관되지 않습니다. 따라서 에 대한 응용 프로그램의 책임은 필요한 경우이 데이터를 보관하십시오.

이렇게 재설정하면 작동하지 않습니다.

QNetworkAccessManager을 통해 네트워크 요청을 직접 수행하면 QNetworkReply 데이터를 사용할 수 있습니다. QWebPage 접근 방식은 이미지, js 등을 제외한 모든 정보를 다운로드하는 반면 실제 URL은 하나만 가져옵니다.

+0

네, 다운로드 한 모든 것을 원하므로 웹 페이지 접근 방식을 원합니다. 하지만 네가 맞다고 생각해. 벌써 읽었 어. 그럼 어떻게해야합니까 ... –

+0

@ 리차드 : 당신이 필요로하는 데이터에 달려 있다고 생각합니다. 'QWebPage'가 그들을 처리했다면 아마 정보의 일부가 그것으로부터 가능할 것입니다. 너에게 도움이되지 않을까? – Troubadour

+0

저는 이미지/데이터 자체 (분석 용)와 페이지의 위치, 가시성 등의 정보를 렌더링하는 페이지의 이미지를 처리합니다. 따라서 웹 페이지 접근법. 나는 많은 페이지를 처리하려고 할 때 이미지를 두 번 다운로드하지 않으려 고 노력하고 있습니다. –

관련 문제