pyqt5 异步请求返回后,ui组件已销毁导致crash的简单解决方法

pyqt5 异步请求返回后,ui组件已销毁导致crash的简单解决方法

  • 场景
  • 解决思路

场景

在客户端编写时,涉及到从服务器获取数据, 在主线程同步请求会卡死界面,所以一般都会采用异步的方式,通过背景线程去请求数据,然后通知主线程处理。这种方式有个问题是,很容易导致程序crash。譬如打开一个对话框,开启线程获取数据,由于网络延迟,等到数据返回,回调主线程渲染ui时候,该对话框已经被用户销毁,那这时候,就会抛出:
RuntimeError: wrapped C/C++ object of type XXX has been delete
这种异常,导致整个应用崩溃。

解决思路

要防止这种错误,思路非常简单,就是当数据需要渲染时,发现ui组件已经销毁了,就直接不渲染就完事了。所以最直接的办法,就是在组件销毁的钩子函数中,做个标记。等到异步返回渲染的时候,查看此标记就可以了。但如果手动实现的话,代码较多,不是很方便。
鉴于pyqt是直接包裹的c++对象,因此多方查找下,找到了sip这个包
直接requirements.txt添加或者pip install sip
在异步回调主线程的代码里,如下编写:

def cb(data):
	if not sip.isdeleted(ui组件):
		渲染ui()

即可。

你可能感兴趣的:(qt)