在打开 qdialog 的情况下关闭 qmainwindow 时 Python 崩溃

Posted

技术标签:

【中文标题】在打开 qdialog 的情况下关闭 qmainwindow 时 Python 崩溃【英文标题】:Python crash when closing qmainwindow with qdialog open 【发布时间】:2014-01-21 14:53:06 【问题描述】:

我有一个 QMainWindow,每次我点击一个按钮时都会启动一个 QDialog,我无法弄清楚为什么当我在打开一个或多个对话框时关闭 QMainWindow 时 python 二进制文件崩溃。

这不是一个复杂的 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 关闭时杀死它们。

【问题讨论】:

python崩溃时没有堆栈跟踪吗? 实际上它在 Linux 上运行良好,当我在 Windows 上的 ipython 下运行它时,没有回溯,但 QDialogs 保持打开状态,我必须手动关闭它们。我无法在 Windows 上获得任何回溯。 所以你使用的“崩溃”这个词不像that kind of crash? 嗯,是的,当我尝试在 VS2012 中调试 python 进程时,这是我得到的错误:python.exe 中 0x66CDB906 (QtCore4.dll) 处的未处理异常:0xC0000005:访问冲突读取位置0x00000000. 对于 ipython 你的意思是qtconsole?也许在那种情况下,ipython 的 QApplication 和您的代码之间存在一些交互(但这完全取决于您如何运行代码等) 【参考方案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()

【讨论】:

以上是关于在打开 qdialog 的情况下关闭 qmainwindow 时 Python 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在不杀死 VM 的情况下关闭和重新打开 Spring Data Neo4J 上下文

如何在没有按钮的情况下关闭tkinter窗口而不完全关闭Python?

使用C#和Xamarin表单 - 如何在不设置闭包链的情况下关闭一个模态

将 QMainWindow 与 Qdialog 小部件连接起来

有啥方法可以在不关闭其 BaseStream 的情况下关闭 StreamWriter?

GWT 异步生成,在某些情况下关闭?