Qt Jambi:访问 QNetworkReply 的内容

Posted

技术标签:

【中文标题】Qt Jambi:访问 QNetworkReply 的内容【英文标题】:Qt Jambi: Accessing the content of QNetworkReply 【发布时间】:2010-06-03 17:49:32 【问题描述】:

我无法访问 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();
    


【问题讨论】:

只是想知道为什么你需要网页,而你可以只使用 QNetworkAccessManager 做同样的事情? @Anton:我使用网页有两个原因:1)它为我提供了页面所需的所有资产(css、js、图像 - 包括 css 中的那些)和 2)因为我需要渲染的html 您是如何在不重新下载的情况下访问图像数据的? @richard - 我没有。我再次下载它们。在Qt jambi中,所有的方法都是final的,所以不能覆盖QNetworkReply或者QNetworkAccessManager中的相关方法。很烦人。没有重新编译 Qt Jambi(这显然不是微不足道的),我已经没有想法了。 很烦人。我正在使用 PyQt,所以应该有更多的运气 【参考方案1】:

我想QWebPage 已经查询了所有进来的QNetworkReply 对象。文档说

QNetworkReply 是顺序访问 QIODevice,表示一旦数据 从对象中读取,它不再 由设备保存。因此是 应用程序的责任 如果需要,请保留这些数据。

所以重置它是行不通的。

请注意,如果您直接通过QNetworkAccessManager 发出网络请求,您会得到一个带有可用数据的QNetworkReply。你只能得到一个实际 URL,而 QWebPage 方法会下载其他所有内容,即图像、js 等。

【讨论】:

是的,我希望下载所有内容,因此采用网页方法。但是,是的,我认为你是对的,它们已经被阅读过了。那么该怎么办...... @Richard:我想这取决于您需要什么数据。如果QWebPage 已经处理了它们,那么大概可以从中获得一些信息。也许这对你来说不实用? 我关注页面中的图像 - 图像/数据本身(用于分析)以及渲染信息,如页面中的位置、可见性等。因此,网页方法。我只是希望尽量避免下载图像两次,因为我要处理很多页面。 @Richard:听起来你可以使用QWebElement 来获取图像,但这只是在 4.6 中引入的,所以我认为你在占碑中还没有这个功能?另外,我不知道您将如何获得这些职位,但您也不会从每个QNetworkReply 获得这些职位。 是的 QWebElement 在 4.4 中不可用,我认为 jambi 正在停产。我在 javascript 中进行所有 DOM 跳跃和检查以避开 QWebElement。

以上是关于Qt Jambi:访问 QNetworkReply 的内容的主要内容,如果未能解决你的问题,请参考以下文章

Qt Jambi 开发还有可能吗?

Qt-Jambi 冗长,尤其是 QtDynamicMetaObjectPrivate

通过 Qt Jambi 使用粒子(Qt 的惊人功能)

QNetworkReply:在 QWebView 中禁用了网络访问

Qt jambi Eclipse 集成问题

如何在 Windows 7 的 Eclipse 中安装 Qt-Jambi?