gpt4 book ai didi

python - 取消 QFileDialog 时如何停止子窗口关闭

转载 作者:行者123 更新时间:2023-12-01 00:31:39 25 4
gpt4 key购买 nike

我有一个处理打开项目的父类。可以从子窗口打开项目,该子窗口调用父函数来处理打开项目。但是,当从子窗口取消文件对话框时,整个应用程序将退出。

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()

我不明白为什么在文件对话框中按下取消键时程序不会返回到子窗口。有没有办法让家长负责打开项目并解决这个问题?

最佳答案

问题可能在于 hideshow 事件的不同事件计时:我想,直到 open 函数返回, Qt 尚未将子窗口“注册”为将检查 QApplication.quitOnLastWindowClosed() 的窗口。选项,这意味着即使子窗口显示了一小部分时间,它仍然“认为”只有一个窗口(父窗口)。

根据您的要求,有两种可能性:

  • 在应用程序实例上使用 setQuitOnLastWindowClosed(False),记住在父窗口(或您想要退出的任何其他窗口)的 CloseEvent 中调用 quit关闭);
  • 使用QTimer.singleShot(1, self.hide),它应该延迟足够的隐藏以避免此问题;

第一个解决方案通常更好,我强烈建议您使用它。
我什至不确定使用一毫秒的延迟实际上是否足以允许向应用程序发出“存在新窗口”通知:可能需要更高的延迟量,并且该值也可以是任意的,具体取决于各种情况条件(包括平台实现)。
根据source code ,一旦顶级小部件关闭,它就会检查所有QApplication.topLevelWidgets(),但根据我的测试,列表不会立即更新:ChildWindow 通常“出现”some show() 之后的时间,但有时(通常是 <2 毫秒后)它根本不会出现在列表中。

关于python - 取消 QFileDialog 时如何停止子窗口关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com