关于使用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是表示如果一个子线程的任务是管理、新建线程,可以允许局部变量的方式保持。”目前似乎出现了 同时存在的线程过多时 因为内存回收机制导致错误。