Сбой Python при закрытии qmainwindow с открытым qdialog

У меня есть QMainWindow, который запускает QDialog каждый раз, когда я нажимаю кнопку, и я не могу понять, почему происходит сбой бинарного файла python, когда я закрываю QMainWindow, когда открыто одно или несколько диалоговых окон.

Это не сложное приложение Qt, и я действительно изо всех сил пытаюсь понять, что происходит.

Вот код:

# dependency modules
from PyQt4 import QtGui
import sys

# custom modules
from ui import SingleOrderUI, DashBoardUI

class SingleOrder(QtGui.QDialog, SingleOrderUI.Ui_SingleOrder):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

class DashBoard(QtGui.QMainWindow, DashBoardUI.Ui_DashBoard):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        super(DashBoard, self).__init__()

        # setup UI
        self.setupUi(self)

        self.newOrderBtn.clicked.connect(self.newOrder)


    def newOrder(self):
        print 'New order clicked'
        so = SingleOrder(self)
        so.show()      

app = QtGui.QApplication(sys.argv)
window = DashBoard()
window.show()
sys.exit(app.exec_())

Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ: при запуске с помощью ipython диалоги все еще отображаются после закрытия QMainWindow, так что, возможно, проблема возникает из-за этого. Я даю QMainWindow в качестве родительского аргумента для QDialog, я думал, что этого достаточно, чтобы их убить, когда QMainWindow закрывается.


person sevenup    schedule 21.01.2014    source источник
comment
Разве нет трассировки стека при сбое python?   -  person sashoalm    schedule 21.01.2014
comment
Ну, на самом деле он отлично работает в Linux, и когда я запускаю его под ipython в Windows, трассировки нет, но QDialogs остаются открытыми, и мне приходится закрывать их вручную. Я не могу получить трассировку в Windows.   -  person sevenup    schedule 21.01.2014
comment
Значит, слово «авария», которое вы используете, не похоже на такого рода аварии?   -  person sashoalm    schedule 21.01.2014
comment
Ну да, когда я пытаюсь отладить процесс python в VS2012, я получаю сообщение об ошибке: Необработанное исключение по адресу 0x66CDB906 (QtCore4.dll) в python.exe: 0xC0000005: Местоположение чтения с нарушением прав доступа 0x00000000.   -  person sevenup    schedule 21.01.2014
comment
Для ipython вы имеете в виду qtconsole? Возможно, в этом случае есть некоторое взаимодействие между QApplication ipython и вашим кодом (однако все зависит от того, как вы запускаете код и т. д.)   -  person Bakuriu    schedule 21.01.2014


Ответы (1)


Хорошо, я нашел обходной путь для этого, но я не уверен, что это правильный способ сделать это.

В моем методе инициализации DashBoard я добавил список Python, в котором будут храниться все открытые диалоги:

def __init__(self):
    QtGui.QMainWindow.__init__(self)
    super(DashBoard, self).__init__()

    # setup UI
    self.setupUi(self)
    self.newOrderBtn.clicked.connect(self.newOrder)

    self.soTab = []

Затем в том же классе я определил метод для обработки closeEvent и закрытия всех диалогов.

def closeEvent(self, event):
    for so in self.soTab:
        if so:
            so.close()
    event.accept()
person sevenup    schedule 21.01.2014