【问题标题】:Segmentation fault: 11 on a QMainWindow exit button with pyqt5 on OSX分段错误:在 OSX 上带有 pyqt5 的 QMainWindow 退出按钮上的 11
【发布时间】:2023-03-07 10:23:01
【问题描述】:

我在 OSX 上发现了一个奇怪的行为,但在 Windows 上却没有。

我用 pyqt5 制作了一个软件,当我关闭一个子窗口时,我遇到了“分段错误:11”的崩溃

为了更好地解释,我有一个主窗口,我可以在其中打开其他窗口向用户询问一些信息。当我关闭第二个窗口时发生错误。

我有一个closeEvent 函数:

def closeEvent(self, event):
    self.Close_OBJ.emit()
    self.close()

向主窗口发送pyqtSignal

如果我评论self.Close_OBJ.emit()我不再有分段错误,但我需要这个,以便我的主窗口可以对那个子窗口的关闭做出反应。

同样令人困惑的是,我还有其他子窗口,其中我有相同的 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 行,我就没有分段错误了。这条线会不会和关闭窗口有冲突?

【问题讨论】:

  • 尝试将self.close()更改为super().closeEvent(event)
  • super()closeEvent(event)同样的错误
  • 你可以提供一个MCVE,可能是其他配置引起的错误
  • 我刚刚做了,你说得对,我应该早点添加示例...
  • 试试下面的答案看看有没有报错,在终端执行:stackoverflow.com/a/47275100/6622587

标签: python pyqt


【解决方案1】:

当您将 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)

【讨论】:

  • 我不明白为什么它可以在 Windows 上运行,但在 OSX 上却不行。
  • @ymmx 也许内部实现使其在每个操作系统中的工作方式不同
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2014-05-02
  • 2012-05-19
  • 2017-10-06
  • 2012-04-24
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多