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



我已经为打开文件选项创建了一个子类。除了PYQT5,我还导入了python库Mido &以读取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中做到这一点。此外,如何使用特定的文件扩展名。

我相信你对QFileDialog的工作原理有点困惑。

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

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

因为您只需要打开一个特定的文件类型,所以绝对不需要子类化,正如文档开头所解释的:

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

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

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

试试下面的脚本:

class FileDialog(QtWidgets.QFileDialog):
def __init__(self, *args, **kwargs):
super(FileDialog, self).__init__(*args, **kwargs)
self.setOption(QFileDialog.DontUseNativeDialog, True)
self.setNameFilters(["Excel File (*.xlsx *.xls)","CSV File (*.csv)","Log File (*.log)"])
self.setFileMode(QFileDialog.ExistingFiles)
def accept(self):
super(FileDialog, self).accept()

最新更新