2

我想编写一个 Qt 应用程序,它使用 Webkit 作为它的 gui 从服务器获取数据并显示它。我让它在 Linux 和 OS X 下运行没有问题,但在 Windows 下 XMLHttpRequest 总是返回状态 0,我不知道为什么。这是我使用的 pyqt 代码:

import sys, os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)
web = QWebView()
web.page().settings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)
path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'index.html'))
url = "file://localhost/" + path
web.load(QUrl(url))
web.show()
sys.exit(app.exec_())

这是我用来测试它的html HTML/JS:

<!DOCTYPE html>
<title>TEST</title>
<h1>TEST</h1>
<div id="test"></div>
<script type="text/javascript">
    function t(text) { document.getElementById("test").innerHTML = text }

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if(this.status != 0)
            t(this.responseText)
        else
            t("Status is 0")
    }
    xhr.open("GET", "https://jeena.net/")
    xhr.send()
</script>

在 Linux 上,它会打开一个带有 WebKit 视图的新窗口,将 html 本地 index.html 文件加载到其中并呈现它,其中显示 TEST 标题。之后,它运行 XMLHttpRequest 代码来获取网站内容,并使用 innerHTML 将其设置到准备好的 div 中。

在 Windows 上,它会加载并显示标题,但是当它运行 xhr 代码时,状态始终为 0,并且无论我做什么,它都不会改变。

据我了解LocalContentCanAccessRemoteUrls,即使在 Windows 上,xhr 也可以从远程网站获取该内容,知道为什么这不起作用吗?我在我的 Windows 机器和 python v2.7 上使用 Qt 版本 4.9.6。

4

1 回答 1

2

我认为有两种简单的尝试可以解决这个问题。

我的第一个想法是这可能是由于跨域请求。似乎没有简单的方法可以在 QWebkit 中禁用跨域保护。我从这个 stackoverflow 问题中得到了信息:

QtWebkit 同源策略

如接受的答案所述:

“默认情况下,Qt 不公开禁用/白名单相同来源策略的方法。扩展相同 (qwebsecurityorigin.cpp) 并使其工作。”

但是,既然你已经在 linux 和 mac 上运行了一切,那么上面的可能不是原因。

另一种可能性是您没有在 Windows 上使用 Qt 启用 openssl。因为我注意到你已经请求了一个https页面,这应该需要 openssl。您可以将页面更改为http以快速测试这种可能性。

于 2013-03-30T15:59:52.940 回答