QNetworkAccessManager进程以退出代码139完成(被信号11:SIGSEGV中断)

时间:2019-07-16 14:48:03

标签: python pyqt pyqt5

基本上,我在QStackedWidget中有4个小部件,它们是:

  1. HomeWidget
  2. ProcessWidget
  3. ConfirmWidget
  4. LoadingWidget

在ProcessWidget和LoadingWidget中,我将使用QNetworkAccessManager与我的API通信。

我的申请流程:

  1. 从HomeWidget开始。

  2. 然后,切换到ProcessWidget。

  3. 然后,切换到ConfirmWidget。

  4. 然后,切换到LoadingWidget。

  5. 然后,切换回HomeWidget,依此类推。

在ProcessWidget中,我只发出1个请求。但是在LoadingWidget中,我有4个请求。

这是我为每个请求进行通信的方式(每个请求的区别仅在于URL):

def doRequest(self):
    url = "http://127.0.0.1:8000/api"
    req = QtNetwork.QNetworkRequest(QUrl(url))

    self.networkAccessManager = QtNetwork.QNetworkAccessManager()
    self.networkAccessManager.finished.connect(self.handleResponse)
    self.networkAccessManager.get(req)

def handleResponse(self, reply):

    er = reply.error()

    if er == QtNetwork.QNetworkReply.NoError:

        bytes_string = reply.readAll()
        data = json.loads(str(bytes_string, 'utf-8'))

        # Do something

    else:
        errorMessage = "Error occured: "+ str(er) + "\n"+ str(reply.errorString())
        # Do something

问题是,在我的应用程序流程的第4次迭代中,我的应用程序突然崩溃了。出现此错误:

Process Finished With Exit Code 139 (Interrupted by signal 11: SIGSEGV)

怎么了?

1 个答案:

答案 0 :(得分:0)

最后,我可以通过重新定义请求的方式来解决问题。

这是代码:

# Instantiate the NetworkAccessManager as the Widget's property
self.networkAccessManager = QtNetwork.QNetworkAccessManager() 

def doRequest(self):
    url = "http://127.0.0.1:8000/api"
    req = QtNetwork.QNetworkRequest(QUrl(url))

    reply = self.networkAccessManager.get(req)
    reply.finished.connect(self.handleResponse)

def handleResponse(self):

    reply = self.sender()

    er = reply.error()

    if er == QtNetwork.QNetworkReply.NoError:

        bytes_string = reply.readAll()
        data = json.loads(str(bytes_string, 'utf-8'))

        # Do something

    else:
        errorMessage = "Error occured: "+ str(er) + "\n"+ str(reply.errorString())
        # Do something

    reply.deleteLater()

我可以得出结论,问题来自答复对象。