使用QTWebKit显示存储在内存中的网站

时间:2011-06-21 14:54:03

标签: qt webkit qtwebkit

目前,我将我的HTML,JS,CSS,图形等本地存储在硬盘上,并使用QWebFrame::SetUrl( QUrl::fromLocalFile( "appFolder\html\index.html" ))访问它们。在某些时候,我将需要加密本地存储的文件,所以我正在寻找一种方法来解密它们,或者将它们全部解密到内存中并以这种方式访问​​它们。

我知道我可以使用QWebFrame::setContent( htmlData )从内存中加载HTML,这样我就可以加载加密的HTML文件,在内存中解密,然后以这种方式显示,但是我如何处理其他数据(JS) ,CSS,图形等)当前存储在子文件夹中?

或者,有没有办法可以拦截访问所有HTML,JS,CSS等文件的请求,并在加载时对其进行解密?

通过使用我自己的NetworkAccessManager,我可以拦截对createRequest的调用,这样我就可以看到每个文件的加载时间,但我看不到如何使用它来动态解密数据。我还可以将插槽函数连接到finished(QNetworkReply*)信号,但此时数据已经被读取 - QIODevice的当前位置指向文件的末尾。

我非常感谢任何有关正确方向的建议或指示。

1 个答案:

答案 0 :(得分:2)

我认为在你的情况下,最好的解决方案是继承 QNetworkReply 类,并在重新实现的QNetworkAccessManager::createRequest()函数中使用这个新类。

通常,您应该重新实现 QNetworkReply 的下一个虚拟功能: bytesAvailable()readData(char *data, qint64 maxSize)close()abort()

例如,readData应该如下:

qint64 NetworkReplyEx::readData(char *data, qint64 maxSize)
{
    return m_buffer.read(data, maxSize);
}

其中m_buffer已经是解密数据。

此外,您需要在此类中添加所有必需的逻辑以获取加密数据,解密此数据... 最后,您应该在新类中手动发出finished()信号,因此QWebView或其他相关类将获得解密的html。