我在 OSX 上发现了一种奇怪的行为,但在 Windows 上却没有。
我用 pyqt5 制作了一个软件,当我关闭子窗口时,我发生了崩溃,并显示“段错误:11”
为了更好地解释,我有一个主窗口,我可以在其中打开其他窗口来向用户询问一些信息。当我关闭第二个窗口时发生错误。
我有一个 closeEvent
函数:
def closeEvent(self, event):
self.Close_OBJ.emit()
self.close()
它将pyqtSignal
发送到主窗口。
如果我评论 self.Close_OBJ.emit()
,我就不再出现段错误,但我需要这个,以便我的主窗口可以对该子窗口的关闭使用react。
同样令人困惑的是,我还有其他子窗口,其中有相同的 closeEvent
函数,并且运行良好。
我不明白为什么我在 Windows 操作系统上没有这个问题。
这是该问题的一个最小示例:
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class Modify_1_NMM(QMainWindow):
Close_OBJ = pyqtSignal()
def __init__(self,):
super(Modify_1_NMM, self).__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.mainHBOX_param_scene = QHBoxLayout()
self.label = QLabel('Please, close this window')
self.mainHBOX_param_scene.addWidget(self.label)
self.centralWidget.setLayout(self.mainHBOX_param_scene)
def closeEvent(self, event):
self.Close_OBJ.emit()
self.close()
class StimEdit(QMainWindow):
def __init__(self, parent=None):
super(StimEdit, self).__init__()
self.NewModifyXNMM = None
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.mainHBOX_param_scene = QHBoxLayout()
self.B = QPushButton('clik here to open o window')
self.B.setFixedSize(400,200)
self.B.clicked.connect(self.ModXNMMclicked)
self.mainHBOX_param_scene.addWidget(self.B)
self.centralWidget.setLayout(self.mainHBOX_param_scene)
def ModXNMMclicked(self,):
if self.NewModifyXNMM == None:
self.NewModifyXNMM = Modify_1_NMM()
self.NewModifyXNMM.Close_OBJ.connect(self.close_ModXNMM)
self.NewModifyXNMM.show()
@pyqtSlot()
def close_ModXNMM(self):
print('about to close',self)
self.NewModifyXNMM = None
print('did closed')
def main():
app = QApplication(sys.argv)
ex = StimEdit(app)
ex.show()
sys.exit(app.exec_( ))
if __name__ == '__main__':
main()
当我单击主窗口上的按钮时,会打开第二个窗口。当我关闭第二个窗口时,它崩溃了(甚至不是一直......但大多数时候)。
在 pycharm 上我收到此错误消息:
about to close <__main__.StimEdit object at 0x103f0af78>
did closed
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
在终端上我得到:
about to close <__main__.StimEdit object at 0x10c706288>
did closed
Segmentation fault: 11
更新
如果我注释掉该行 self.NewModifyXNMM = None
我就不再遇到段错误了。这行代码是否可能与窗口关闭冲突?
最佳答案
当您将 None 设置为变量时,对象引用似乎会丢失,可能的解决方法是使用 deleteLater 和销毁的信号:
@pyqtSlot()
def close_ModXNMM(self):
print('about to close',self)
self.NewModifyXNMM.deleteLater()
self.NewModifyXNMM.destroyed.connect(self.on_destroyed)
print('did closed')
@pyqtSlot('QObject*')
def on_destroyed(self, o):
self.NewModifyXNMM = None
print(self.NewModifyXNMM)
关于python - 段错误: 11 on a QMainWindow exit button with pyqt5 on OSX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55449658/