如何使用 QFileDialog 打开带有 .mid 后缀的文件

Posted

技术标签:

【中文标题】如何使用 QFileDialog 打开带有 .mid 后缀的文件【英文标题】:How to use QFileDialog to open file with .mid suffix 【发布时间】:2021-02-11 11:37:36 【问题描述】:

我为打开文件的选项创建了一个子类。除了 PYQT5,我还导入了 python 库 Mido 和 py-midi 以读取 MIDI 文件。如果我的逻辑是正确的。我将使用 PYQT5 的 FileDialog 来检索文件,将其分配给一个变量,然后使用 Mido 读取该 MIDI 文件,然后我将使用 py-midi 编辑这些文件

class OpenDialog(QFileDialog):

    def __init__(self, *args, **kwargs):
        super(OpenDialog, self).__init__(*args, **kwargs)

        self.setWindowTitle("Open")
        self.setFixedSize(1000, 450)

        buttons = QDialogButtonBox.Open | QDialogButtonBox.Cancel

        self.buttonBox = QDialogButtonBox(buttons)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.buttonBox)
        self.setLayout(self.layout)

        # OpenedFile =

我已将 OpenedFile 注释掉,因为我计划将其用作变量来链接到打开的文件。但是,我不确定如何在 PYQ5 中做到这一点。此外,如何使用特定的文件扩展名执行此操作。

【问题讨论】:

你的问题不清楚,能不能给我解释清楚 【参考方案1】:

我相信您对 QFileDialog 的工作原理有些困惑。

首先,Qt默认会尝试使用系统提供的native文件对话框,所以一般你不应该尝试通过子类化创建自己的,除非你需要非常 em> 特殊行为。

然后,QFileDialog 是一个 QDialog,它已经拥有自己的(私有)布局和小部件,包括显示文件和文件夹的区域、路径的文本字段以及标准的打开/取消按钮。

由于您只需要打开特定的文件类型,因此绝对不需要子类化,正如documentation 开头所述:

创建 QFileDialog 最简单的方法是使用静态函数。

这些都列在static members 中,您可能对getOpenFileName() 感兴趣;请注意,文件的静态函数(不是目录的函数)总是返回一个元组,包括路径和选定的文件类型过滤器:

    def showOpenFileDialog(self):
        fileName, filter = QFileDialog.getOpenFileName(self, 'Open file', 
            'some/default/path/', 'MIDI files (*.mid)')
        if fileName:
            self.openMidiFile(fileName)

【讨论】:

以上是关于如何使用 QFileDialog 打开带有 .mid 后缀的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QFileDialog 中过滤带有空格字符的文件名?

带有默认目录的 QFileDialog

如何在 Qt Designer 中创建一个打开 QFileDialog 的信号?

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

如何让 QFileDialog 提示覆盖?

如何在pyside中为QtGui.QFileDialog.getOpenFileName定义一个QDir?