Pyside:QNetworkAccessManager 不发送请求

Posted

技术标签:

【中文标题】Pyside:QNetworkAccessManager 不发送请求【英文标题】:Pyside: QNetworkAccessManager sends no Request 【发布时间】:2015-10-22 10:13:48 【问题描述】:

我尝试与 PySide(Ubuntu 15.04、Python3.4、PySide 1.2.4)建立网络连接。我使用了来自the documentation的示例代码。

QNetworkAccessManager 没有发送请求,我也没有收到任何答复。我用QNetworkSession(QNetworkConfigurationManager().defaultConfiguration()).State() 检查了网络状态,但它说状态无效。这似乎没有任何意义,因为我使用的是通过以太网电缆连接网络的台式电脑。

我的完整测试示例如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PySide.QtGui import QApplication
from PySide.QtCore import QUrl
from PySide.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkSession, QNetworkConfigurationManager


def replyFinished(reply):
    print(reply)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    manager = QNetworkAccessManager()
    manager.finished.connect(replyFinished)
    print(QNetworkSession(QNetworkConfigurationManager().defaultConfiguration()).State())
    print("Sending request")
    print(manager.get(QNetworkRequest(QUrl("http://www.heise.de/ct/"))))

打印出来

PySide.QtNetwork.QNetworkSession.State.Invalid
Sending request
<PySide.QtNetwork.QNetworkReply object at 0x7f4b59c9af08>

但它应该显示PySide.QtNetwork.QNetworkReply 对象两次。

【问题讨论】:

如果没有app.exec_(),它将无法工作。 【参考方案1】:

我的例子太小了。由于 Pavel Strakhov 的评论,我意识到了这一点。我将它扩展为显示一个带有按钮的窗口。通过单击它成功连接的按钮。 QNetworkSession(QNetworkConfigurationManager().defaultConfiguration()).State() 仍然无效,但它可以工作。

这是工作代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PySide.QtGui import QApplication, QWidget, QBoxLayout, QPushButton
from PySide.QtCore import QUrl
from PySide.QtNetwork import QNetworkAccessManager, QNetworkRequest,  QNetworkSession, QNetworkConfigurationManager


class Window(QWidget):
   def __init__(self):
        super().__init__()
        self.manager = QNetworkAccessManager()
        self.manager.finished.connect(self.reply_finished)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        button = QPushButton("connect")
        button.clicked.connect(self.network_connect)
        layout.addWidget(button)
        self.setLayout(layout)
        self.setWindowTitle("Network test")
        self.setGeometry(100, 100, 200, 150)
        self.show()

    def network_connect(self):
        print(QNetworkSession(QNetworkConfigurationManager().defaultConfiguration()).State())
        request = QNetworkRequest(QUrl("http://example.org"))
        print("Sending request")
        self.manager.get(request)

    def reply_finished(self, reply):
        print(reply)
        print(reply.readData(500))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    app.exec_()

【讨论】:

以上是关于Pyside:QNetworkAccessManager 不发送请求的主要内容,如果未能解决你的问题,请参考以下文章

PySide2兼容PySide1的补丁代码

pySide: ExtensionLoader_Pyside_QtGUI.py 找不到指定的模块

Python/pyside,pyqt(pyside,pyqt optional): 控制文本选择的函数

当 slot 函数具有默认参数=None 时,PySide2 的行为与 PySide 不同

python3的Pyside-uic?

Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错