Qt Jambi: Accessing the content of QNetworkReply

陌路散爱 提交于 2019-12-23 02:56:06

问题


I'm having trouble accessing the content of QNetworkReply objects. Content appears to be empty or zero. According to the docs (translating from c++ to java) I think I've got this set up correctly, but to no avail. Additionally an "Unknown error" is being reported.

Any ideas much appreciated. 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:


I imagine that the QWebPage has already queried all the QNetworkReply objects as they came in. The docs say

QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it no longer kept by the device. It is therefore the application's responsibility to keep this data if it needs to.

so resetting it isn't going to work.

Note that if you make the network request directly through QNetworkAccessManager you do get a QNetworkReply with data available. You only get one though for the actual URL whereas the QWebPage approach downloads everything else after that i.e. images, js, etc.



来源:https://stackoverflow.com/questions/2968482/qt-jambi-accessing-the-content-of-qnetworkreply

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!