通常,当我通过Qt 4.8执行网络请求时,不需要显式运行QApplication.processEvents()
(请参阅此StackOverflow代码示例)。
但是,当我从中的JavaScript发出网络请求时QWebView
,除非我在请求完成之前调用该方法,否则该方法将无法工作,如下所示(此处语法高亮的要点)。
澄清:尽管我了解到插槽似乎已连接,但我在忽略呼叫时甚至没有发送
请求。processEvents()
finished
from PyQt4 import QtCore, QtGui, QtNetwork, QtWebKit
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
QtNetwork.QNetworkProxyFactory.setUseSystemConfiguration(True)
self.view = QtWebKit.QWebView(self)
self.setCentralWidget(self.view)
self.view.setPage(QtWebKit.QWebPage(self.view))
self.view.page().mainFrame().javaScriptWindowObjectCleared.connect(self.refreshJS)
self.view.setHtml(
'''<html>
<body>
LOADING...
<script>
<!--
APP.request();
//-->
</script>
</body>
</html>'''
)
@QtCore.pyqtSlot()
def request(self):
request = QtNetwork.QNetworkRequest(QtCore.QUrl('http://localhost/test.php'))
manager = QtNetwork.QNetworkAccessManager()
manager.finished.connect(self.managerFinished)
reply = manager.post(request, b'a=A')
reply.finished.connect(self.finished)
############################################################
### FIXME: Request never even *sent* if this is missing ###
############################################################
while not reply.isFinished():
QtGui.QApplication.processEvents()
##########################################################
print('request FINISHED? '+str(reply.isFinished())+', ERROR '+str(reply.error()))
def finished(self):
print('finished')
def managerFinished(self):
print('managerFinished')
def refreshJS(self):
print('refreshJS')
self.view.page().mainFrame().addToJavaScriptWindowObject('APP', self)
if __name__ == '__main__':
import os, sys
app = QtGui.QApplication(sys.argv)
MainWindow().show()
sys.exit(app.exec_())
您对QNetworkAccessManager的使用与链接中指出的有一个很大的不同。请注意,您的版本是同步的:通过等待答复来阻止“请求”插槽中的事件循环,因此QNetworkAccessManager不能工作,除非您手动推送事件。从另一侧看,该示例是异步的:它创建请求,连接“完成”信号并让事件循环起作用。这样,事件循环不会被阻止,并且网络管理器可以正常工作。我了解在您的情况下,“请求”插槽必须是同步的,因此processEvents在这里是必须的。
编辑
如果要进行request
异步处理,则需要确保QNetworkAccessManager
对象在request
方法外是持久的。对其进行初始化,__init__(self)
并将其用于request. Probably
QNetworkReply`中的POST ,也需要保持持久性,您需要对其进行检查。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句