使用 QFileDialog class 时如何避免 parent 小部件警告?

How to avoid parent widget warning when using QFileDialog class?

我正在 Microsoft Python 和 PyQt5 学习 Windows 7. 我的 IDE 是 PyCharm 4.5 CE。

我正在尝试使用户可以轻松地 select 文件或目录的文件对话框。

我的代码是...

# coding: utf-8

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_gui()

    def init_gui(self):

        file_names = QFileDialog.getOpenFileNames(self, "Select one or more files to open", "C:/Windows", "")
        print(file_names)

        self.setGeometry(100, 100, 500, 300)
        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec_())

这段代码工作正常。但唯一让我烦恼的是这个。

parent main window 中有很多按钮,其中一个按钮显示文件对话框。

在这种情况下,什么是正确的parent?

来自 PyQt5 文档的方法签名是:

QStringList getOpenFileNames (QWidget parent=None, QString caption=QString(), QString directory=QString(), QString filter=QString(), QString selectedFilter=None, Options options=0)

父级必须是 QWidget 或继承自 QWidget 的某些 class 的实例,而这正是 QMainWindow 的实例(这解释了为什么一切按预期工作)。

现在,了解 PyCharm 显示警告的原因:如果您查看 QFileDialog.py 文件,该文件是由 PyCharm 从 PyQt5\QtWidgets.pyd 自动生成的,您会看到方法 getOpenFileNames 未声明为 staticmethod 也未声明为 classmethod:

def getOpenFileNames(self, QWidget_parent=None, str_caption='', str_directory='', str_filter='', str_initialFilter='', QFileDialog_Options_options=0): # real signature unknown; restored from __doc__
    """ QFileDialog.getOpenFileNames(QWidget parent=None, str caption='', str directory='', str filter='', str initialFilter='', QFileDialog.Options options=0) -> (list-of-str, str) """
    pass

所以 PyCharm 期望(错误地)在 QFileDialog 的实例上调用该方法,但这里你没有 QFileDialog 的实例(因为方法文档字符串表明真正方法签名未知),因此它期望方法的第一个参数 (self) 是 QFileDialog 的实例,因此它会引发警告。

您可以通过仅针对所需语句禁用检查来关闭此类警告:

# noinspection PyTypeChecker,PyCallByClass
file_names = QFileDialog.getOpenFileNames(self, "Select one or more files to open", "C:/Windows", "")
print(file_names)