使用QFileDialog类时如何避免父窗口小部件警告?

时间:2016-03-01 08:27:12

标签: python-3.x pyqt pyside

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

我正在尝试向用户创建文件对话框,可以轻松选择文件或目录。

我的代码是......

# 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_())

此代码正常运行。但唯一让我烦恼的是这个。 enter image description here

父主窗口中有许多按钮,其中一个按钮显示文件对话框。

在这种情况下,适当的父母是什么?

1 个答案:

答案 0 :(得分:3)

PyQt5文档中,方法签名是:

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

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

现在,要了解为什么PyCharm会显示警告:如果您查看QFileDialog.py文件,该文件由PyCharm从PyQt5\QtWidgets.pyd自动生成,您将看到方法getOpenFileNames不是声明为staticmethodclassmethod

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的实例(因为docstring方法表明真正的方法签名是未知的),因此,它希望方法的第一个参数(self)是QFileDialog的一个实例,因此会抛出警告。

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

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