如何使 QFileDialog.AnyFile 工作?

How does one make QFileDialog.AnyFile work?

根据 PyQt5 文档,指定 QFileDialog.AnyFile 应该消除指定文件已经存在的要求。但是,这似乎不起作用。我做错了什么,还是这个功能不再有效?这是我的代码:

import os

from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QFileDialog, QWidget


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.title = "QFileDialog.AnyFile doesn't work."
        self.left = 10
        self.top = 30
        self.width = 320
        self.height = 200

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        dlg= QFileDialog()
        dlg.setFileMode(QFileDialog.AnyFile)
        fname, _= dlg.getOpenFileName(parent=self, directory=os.getcwd(),
          caption='Select a file')
        self.show()


if __name__ == '__main__':
   import sys

   app = QApplication(sys.argv)
   ex = App()

   sys.exit(app.exec_())

您存在以下误解:

  • QFileDialog::getOpenFileName() 是一个静态方法,它不使用“dlg”对象,而是创建一个新的 QFileDialog,因此设置或修改任何“dlg”属性 不会影响将显示的 QFileDialog。

  • 函数QFileDialog::getOpenFileName()旨在获取the docs中指示的现有文件的名称,因此它设置的fileMode是QFileDialog::ExistingFile,所以修改那个行为是矛盾的。

This is a convenience static function that returns an existing file selected by the user. If the user presses Cancel, it returns a null string.

(强调我的)


所以如果你想获取一个文件的名称,即使它不存在,你必须使用静态方法 QFileDialog::getSaveFileName(),如 the docs:

所示

This is a convenience static function that will return a file name selected by the user. The file does not have to exist.

(强调我的)

fname, _ = QFileDialog.getSaveFileName(
    parent=self, directory=os.getcwd(), caption="Select a file"
)