Pyqt5 在我专门双击左键时崩溃而没有错误(右键双打有效)



我正在用Python创建这个应用程序,它与Outlook通信并检索有关每个文件夹中的邮件数量的一些数据以及其他一些东西,我正在使用PyQt5来做到这一点。

但是当我为函数分配信号时,发生了一些奇怪的事情:

self.table_widget.itemDoubleClicked.connect(self.some_function)

如果我双击此项目,一切运行良好。但是如果我用左键点击,它只是冻结,然后崩溃而没有任何错误屏幕(通常如果你执行程序,当它崩溃时,你可以在后面的控制台上看到一些堆栈,对吧?在这种情况下,实际上什么都没有显示(。

我不确定我是否使用了他的信号,所以可能有什么东西......?

无论如何,由于没有发生错误,我试图进行一些打印以查看它会崩溃的地方,但事实证明 t2 屏幕加载得很好,显然当代码返回主循环时它会崩溃......?我不知道,我不可能调试那些东西。

我将尝试仅在此处放置基本代码,以便更容易看到错误,但如果这还不够,我可以显示一些详细信息。

编辑

根据要求,我在下面做了一个最小的可重现示例,它确实以相同的方式崩溃:

from PyQt5.QtCore import QDateTime, Qt, QTimer, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QTableWidgetItem
from PyQt5 import uic
import sys, os
class t0(QMainWindow):
switch_window = pyqtSignal()
def __init__(self):
super(t0, self).__init__()
uic.loadUi(Controller.application_path + r'UIt0.ui', self)
#This .ui file has pretty much a button to click
self.btn_ok.clicked.connect(self.onButtonClick1)
def onButtonClick1(self):
self.switch_window.emit()

class t1(QDialog):    
switch_window = pyqtSignal()
def __init__(self, parent=None):
super(t1, self).__init__(parent)
uic.loadUi(Controller.application_path + r'UIt1.ui', self)
#This .ui file has a QTableWidget
self.tw_indi.setColumnCount(1)
self.tw_indi.setRowCount(1)
self.tw_indi.setItem(0, 0, QTableWidgetItem("*"))
self.tw_indi.itemDoubleClicked.connect(self.direcionar_detalhes)

def direcionar_detalhes(self, item):
self.switch_window.emit()
class t2(QDialog): 
switch_window = pyqtSignal(str)
def __init__(self, parent=None):
super(t2, self).__init__(parent)
uic.loadUi(Controller.application_path + r'UIt2.ui', self)
#This .ui file is identical as the t1.ui, just some minor changes        

class Controller():

controller = None
#questões técnicas do módulo os com pyinstaller
if getattr(sys, 'frozen', False):
application_path = sys.exec_prefix
else:
application_path = os.path.dirname(os.path.abspath(__file__))
tela = None
app = QApplication(sys.argv)
def __init__(self):       
Controller.controller = self
self.mostra_carregamento()
sys.exit(Controller.app.exec_())
def mostra_carregamento(self):
self.view = t0()
self.view.switch_window.connect(self.mostra_indicador)
self.view.show()    
def mostra_indicador(self):
self.view.close()
self.view = t1()
self.view.switch_window.connect(self.sinal_indicador)
self.view.show()
def sinal_indicador(self): 
self.view.close()
self.view = t2()
self.view.show()
if __name__ == '__main__':
control = Controller()

编辑 2

这是 ui 的链接: https://drive.google.com/file/d/1-iFNaWUGtJ4687nTcTFtb7WRKUL37als/view?usp=drivesdk

问题不在于信号,而是当您想为新窗口重用相同的变量时,您将消除该对象的内存,该对象的内存仍然可见并因此正在运行,从而产生未保留的内存访问。解决方案是使用不同的变量名称:

class Controller:
# ...
def mostra_carregamento(self):
self.view0 = t0()
self.view0.switch_window.connect(self.mostra_indicador)
self.view0.show()
def mostra_indicador(self):
self.view0.close()
self.view1 = t1()
self.view1.switch_window.connect(self.sinal_indicador)
self.view1.show()
def sinal_indicador(self):
self.view1.close()
self.view2 = t2()
self.view2.show()

相关内容

最新更新