Ошибка сегментации: 11 на кнопке выхода QMainWindow с pyqt5 на OSX - PullRequest
1 голос
/ 01 апреля 2019

Я получаю странное поведение, которое происходит в 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

UPDATE

если я закомментирую строку self.NewModifyXNMM = None У меня больше нет ошибки сегментации. Возможно ли, что эта строка находится в конфликте с закрытием окна?

1 Ответ

1 голос
/ 23 апреля 2019

Кажется, что ссылка на объект теряется, когда вы устанавливаете переменную 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...