使用QWebView时,为什么必须在QNetworkRequest完成之前调用QApplication.processEvents()?

通常,当我通过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. ProbablyQNetworkReply`中的POST ,也需要保持持久性,您需要对其进行检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

QApplication :: processEvents在Windows中不起作用

来自分类Dev

QLCDNumber使用processEvents()更新-Python 3

来自分类Dev

QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

来自分类Dev

在Qt中,当使用QApplication :: processEvents()时,发现所有窗口都已关闭?

来自分类Dev

VST SDK 2.4仪器-processReplace和processEvents

来自分类Dev

为什么必须在“单”之前调用“ toBlocking”?

来自分类Dev

如何增加PyQt5 app.processEvents()队列深度?

来自分类Dev

为什么打开.bashrc文件时必须在.bashrc之前加上〜/?

来自分类Dev

为什么必须在使用每个函数的每个函数之前声明一个模板?

来自分类Dev

为什么我必须在数据加载之前点击?

来自分类Dev

为什么我必须在数据加载之前点击?

来自分类Dev

Python:QWidget:必须在 QPaintDevice 之前构造 QApplication

来自分类Dev

为什么必须在onChanged(在Flutter中)中调用didChange?

来自分类Dev

为什么必须在类中调用_internal()?

来自分类Dev

为什么必须在function()中包含对函数的调用

来自分类Dev

必须在调用跳过之前调用Order by

来自分类Dev

当通过diff定义函数时,为什么必须在maple中使用unapply运算符?

来自分类Dev

ReactiveUI:使用TestScheduler时,为什么必须在“ ... Throttle ...”中显式指定调度程序

来自分类Dev

为什么我必须在使用管道时将读取的命令放入子shell

来自分类Dev

使用扫描仪读取文件时,为什么扫描仪必须在方法中?

来自分类Dev

为什么必须在catch块中的throw语句之前必须返回return语句

来自分类Dev

为什么我必须在jQuery查询后使用[0]

来自分类Dev

为什么我必须在mongoDB查询中使用+

来自分类Dev

为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

来自分类Dev

为什么必须在分配变量之前将其声明为全局变量?

来自分类Dev

为什么必须在连接之前初始化javascript字符串变量

来自分类Dev

使用es6时为什么必须在服务名称中添加尾部“提供程序”

来自分类Dev

Swift子类的init必须在调用super之前设置所有属性,但属性需要super的init首先完成

来自分类Dev

Swift子类的init必须在调用super之前设置所有属性,但属性需要super的init才能首先完成

Related 相关文章

  1. 1

    QApplication :: processEvents在Windows中不起作用

  2. 2

    QLCDNumber使用processEvents()更新-Python 3

  3. 3

    QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

  4. 4

    在Qt中,当使用QApplication :: processEvents()时,发现所有窗口都已关闭?

  5. 5

    VST SDK 2.4仪器-processReplace和processEvents

  6. 6

    为什么必须在“单”之前调用“ toBlocking”?

  7. 7

    如何增加PyQt5 app.processEvents()队列深度?

  8. 8

    为什么打开.bashrc文件时必须在.bashrc之前加上〜/?

  9. 9

    为什么必须在使用每个函数的每个函数之前声明一个模板?

  10. 10

    为什么我必须在数据加载之前点击?

  11. 11

    为什么我必须在数据加载之前点击?

  12. 12

    Python:QWidget:必须在 QPaintDevice 之前构造 QApplication

  13. 13

    为什么必须在onChanged(在Flutter中)中调用didChange?

  14. 14

    为什么必须在类中调用_internal()?

  15. 15

    为什么必须在function()中包含对函数的调用

  16. 16

    必须在调用跳过之前调用Order by

  17. 17

    当通过diff定义函数时,为什么必须在maple中使用unapply运算符?

  18. 18

    ReactiveUI:使用TestScheduler时,为什么必须在“ ... Throttle ...”中显式指定调度程序

  19. 19

    为什么我必须在使用管道时将读取的命令放入子shell

  20. 20

    使用扫描仪读取文件时,为什么扫描仪必须在方法中?

  21. 21

    为什么必须在catch块中的throw语句之前必须返回return语句

  22. 22

    为什么我必须在jQuery查询后使用[0]

  23. 23

    为什么我必须在mongoDB查询中使用+

  24. 24

    为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

  25. 25

    为什么必须在分配变量之前将其声明为全局变量?

  26. 26

    为什么必须在连接之前初始化javascript字符串变量

  27. 27

    使用es6时为什么必须在服务名称中添加尾部“提供程序”

  28. 28

    Swift子类的init必须在调用super之前设置所有属性,但属性需要super的init首先完成

  29. 29

    Swift子类的init必须在调用super之前设置所有属性,但属性需要super的init才能首先完成

热门标签

归档