关于使用pyqt5一些使用记录

关于使用pyqt5一些使用记录

环境:Win10、Python3.7、Pyqt5 5.15
网络上pyqt5比较细节的使用说明并不太多,只能边使用边试错
由于是事后想起来记录一下,只好先记录目前碰到还有些印象几个点:

细节相关

一.信号/槽

要确认和Pyqt5各个窗体结构之间的槽执行关系,确认信号绑定的方式
网上找的信息说是可以通过信号去激活信号
正确使用:
正确示例

正确示例
但是如果嵌套三层则会出现无法正常激活信号的情况:
错误示例
这个我记不太清是不是这个原因,我开始是按上图这个逻辑但失效,最后是让信号 C-1 直连功能 A-1 就正常了;有条件的朋友可以自行测试一下,把对不对也可以留言一下。

20220225-信号槽问题
1.错误地认为信号激活完全是一个队列的任务

错误情况

上图的接口情况上,如果功能B是由 QObjectA 的线程执行,会导致死锁的情况; QObjectA 的线程执行到自己的信号激活时直接等于执行 功能 A ,而并非等待 功能 B 完成后才执行 功能 A ;

2.要严格让 QObjectA 线程管理自身展示相关的控件

如果在其它线程中进行控件相关的调整,会出现不可预知的潜在错误,会导致再后续添加更深入的功能时出现错误,这类错误是显示错误,或控件丢失;

二.Run过程,执行QtThread,程序报错(调试中没问题)

这里这个估计是python执行的问题;
具体情况:
使用的PyCharm开发,Debug时没有出现问题,但Run的时候执行个别新增 QtThread 的功能时程序闪退,后台显示错误 -1073740791 (0xC0000409),没有任何其它信息。
因为Debug的时候不会出现问题,只能在每句话上print一下看是在哪里出错的,最后发现是在启动并运行子线程的时候出错;
我写了个新的简易类IOThread继承QtThread,主要是承接一些IO任务,我这边新建以及执行在一条语句中表述,没有命名变量去承接:

def IOFunc(*arg, **karg):
	#function
	pass

Class IOThread(QtThread)
	def __init__ (self, func, *arg, **karg):
		self.func = func
		self.arg = arg
		self.karg = karg
		
	def run(self)
		self.func(*self.arg, **self.karg)
		
Class ObjectA(QtObject):
...
	def FuncA(self):
		...
		IOThread(IOFunc, *Targ, **Tkarg).start()	# 此写法在PyCharm Run会出错,写的程序会报错闪退
		...
	def FuncB(self):
		...
		temp = IOThread(IOFunc, *Targ, **Tkarg)
		temp.start()	# 此写法在PyCharm Run会出错,写的程序会报错闪退
		...	
	def FuncC(self):
		...
		while True:
			#IOThread(IOFunc).start()	# 此写法在PyCharm Run会出错,写的程序会报错闪退
			temp = IOThread(IOFunc, *Targ, **Tkarg)
			temp.start()	# 此写法在PyCharm Run不会出错
		...
	def FuncD(self):
		...
		self.temp = IOThread(IOFunc, *Targ, **Tkarg)
		self.temp.start()	# 此写法在PyCharm Run不会出错
		...
...

根据上述情况判断,应该是python Run编译代码的时候新建了QtThread然后以为用完了,结束函数的时候回收内存,导致出错。需要手动让它在函数内保持;FuncC是表示如果一个子线程的任务是管理、新建线程,可以允许局部变量的方式保持。

暂时有印象的是以上这些 2022年2月18日。

————————2022年2月25日————————
关于“FuncC是表示如果一个子线程的任务是管理、新建线程,可以允许局部变量的方式保持。”目前似乎出现了 同时存在的线程过多时 因为内存回收机制导致错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值