【问题标题】:PyQt QFileDialog does not close when using native dialogPyQt QFileDialog 使用本机对话框时不会关闭
【发布时间】:2017-01-14 01:35:47
【问题描述】:

我正在使用 PyQt 从用户那里获取文件名。我已经开发了一个最小的例子来展示这个问题。如果我使用静态函数 QFileDialog.getOpenFileName,并传递 QFileDialog.DontUseNativeDialog,则文件对话框的行为与预期相同。如果我不提供该选项,则当用户选择文件时对话框将不会关闭。该对话框仅在脚本完成执行后关闭。

import sys
import time
from PyQt4.QtGui import *
a = QApplication(sys.argv) 
filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*',    '*', QFileDialog.DontUseNativeDialog) #works
#filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*', '*') #doesn't work
a.quit()
a = None
print filename
print "Dialog should be gone"
time.sleep(10)

当用户选择一个文件时,如果没有使用“DontUseNativeDialog”,对话框会一直保持到10秒休眠后。我希望用户单击“确定”或“取消”后对话框会立即关闭。

【问题讨论】:

  • “本地”是什么意思 - Windows、Linux 或 MacOS?
  • 大多数 GUI 需要 mainloop (event loop) 才能工作。您可以使用a.exec_()(在a=None 之前)在PyQt 中启动主循环并关闭对话框,但是您将无法停止此主循环:)

标签: python pyqt


【解决方案1】:

大多数GUI 需要mainloop (event loop),它始终运行并在 GUI 中完成所有工作。

您可以使用a.exec_()PyQt 中启动mainloop 并关闭对话框,但是您将遇到如何停止此主循环的问题:)

a.quit() 可以关闭它,但如果您在a.exec_() 之前使用它,那么mainloop 不会收到此消息并且不会关闭。如果你放在a.exec_() 之后,那么它将永远不会执行,因为a.exec_() 会阻止所有代码,直到你结束mainloop。但是你可以使用QTimera.quit来通知mainloop在它启动后执行它。

import sys
import time
from PyQt4.QtGui import *
from PyQt4.QtCore import QTimer

a = QApplication(sys.argv) 

#filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*',    '*', QFileDialog.DontUseNativeDialog) #works
filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*', '*') #doesn't work

# run a.quit after 100ms
QTimer.singleShot(100, a.quit)
# run mainloop
a.exec_()

print(filename)
print "Dialog should be gone"
time.sleep(10)

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2014-10-21
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多