我有一个处理开放项目的父类。可以从子窗口打开项目,该子窗口调用父函数来处理打开项目。但是,当从子窗口取消文件对话框时,整个应用程序将退出。
from PyQt5.QtCore import Qt, QDateTime
from PyQt5.QtWidgets import *
from PyQt5 import QtGui
class ParentWindow(QDialog):
def __init__(self):
super(ParentWindow, self).__init__()
self.cw = None
self.setFixedSize(300, 100)
self.button = QPushButton('Open')
self.button.clicked.connect(self.open)
layout = QHBoxLayout()
layout.addWidget(self.button)
self.setLayout(layout)
self.show()
def open(self):
fileDialog = QFileDialog(self, 'Projects')
fileDialog.setFileMode(QFileDialog.DirectoryOnly)
if fileDialog.exec():
self.hide()
name = fileDialog.selectedFiles()[0]
if self.cw:
self.cw.close()
self.cw = ChildWindow(self, name)
class ChildWindow(QDialog):
def __init__(self, parent, name):
super(ChildWindow, self).__init__(parent)
self.setFixedSize(500, 100)
self.setWindowTitle(name)
self.openButton = QPushButton('Open')
self.openButton.clicked.connect(self.parent().open)
layout = QHBoxLayout()
layout.addWidget(self.openButton)
self.setLayout(layout)
self.show()
我不知道为什么在文件对话框中按“取消”时,程序不会返回到子窗口。有没有办法让父母负责打开项目并解决此问题?
[问题可能出在hide
和show
事件的不同事件计时上:我想在open
函数返回之前,Qt尚未将孩子“注册”为要检查的窗口QApplication.quitOnLastWindowClosed()
选项,这意味着即使子窗口显示了一段时间,它仍然“认为”只有一个窗口(父窗口)。
根据您的要求,有两种可能性:
QApplication.quitOnLastWindowClosed()
,记得在父窗口(或您要在关闭时退出的任何其他窗口)的CloseEvent中调用setQuitOnLastWindowClosed(False)
;quit
,这应该延迟隐藏时间,以避免出现此问题;第一个解决方案通常更好,我强烈建议您使用它。我什至不确定使用一毫秒的延迟实际上是否足以允许向应用程序发送“存在新窗口”通知:可能需要更大的数量,并且该值也可以是任意值,具体取决于各种条件(包括平台实施)。根据QTimer.singleShot(1, self.hide)
,一旦关闭顶级窗口小部件,它就会检查所有source code,但是根据我的测试,列表没有立即更新:ChildWindow通常在[[]之后的[[some]]时间出现C0],但有时(通常在<2 ms之后)它根本不会出现在列表中。