首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QtNetwork和PyQt5检查互联网连接情况

使用QtNetwork和PyQt5检查互联网连接情况
EN

Stack Overflow用户
提问于 2018-01-19 14:29:53
回答 1查看 1.4K关注 0票数 2

我试图用QtNetwork来检查网络的连通性,但却找不出正确的方法。这是我正在编写的代码,似乎既没有调用finished信号,也没有调用error信号。我在这里错过了什么?

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtNetwork, QtWidgets


class CheckConnectivity:
    def __init__(self):
        url = QtCore.QUrl("https://www.google.com/")
        req = QtNetwork.QNetworkRequest(url)
        net_manager = QtNetwork.QNetworkAccessManager()
        self.res = net_manager.get(req)
        self.res.finished.connect(self.processRes)
        self.res.error.connect(self.processErr)
        self.msg = QtWidgets.QMessageBox()

    def processRes(self):
        if self.res.bytesAvailable():
            self.msg.information(self, "Info", "You are connected to the Internet.")
        else:
            self.msg.critical(self, "Info", "You are not connected to the Internet.")
        self.msg.show()
        self.res.close()

    def processErr(self, *args):
        print(*args)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ic = CheckConnectivity()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 14:43:29

问题是因为net_manager被删除了,请记住,变量只存在于创建变量的上下文中,在您的示例中,net_manager是一个局部变量,在__init__方法结束时将被删除。

代码语言:javascript
复制
class CheckConnectivity(QtCore.QObject):
    def __init__(self, *args, **kwargs):
        QtCore.QObject.__init__(self, *args, **kwargs)
        url = QtCore.QUrl("https://www.google.com/")
        req = QtNetwork.QNetworkRequest(url)
        self.net_manager = QtNetwork.QNetworkAccessManager()
        self.res = self.net_manager.get(req)
        self.res.finished.connect(self.processRes)
        self.res.error.connect(self.processErr)
        self.msg = QtWidgets.QMessageBox()

    @QtCore.pyqtSlot()
    def processRes(self):
        if self.res.bytesAvailable():
            self.msg.information(None, "Info", "You are connected to the Internet.")
        self.res.deleteLater()

    @QtCore.pyqtSlot(QtNetwork.QNetworkReply.NetworkError)
    def processErr(self, code):
        self.msg.critical(None, "Info", "You are not connected to the Internet.")
        print(code)

使用pyqtSlot()装饰器是明智的,因为它的使用可以帮助应用程序更快一些,消耗更少的内存,但是为此类必须从QObject继承。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48343322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档