2016-03-01 54 views
3

我正在学习Microsoft Windows 7中的Python和PyQt5。我的IDE是PyCharm 4.5 CE。如何在使用QFileDialog类时避免父窗口小部件警告?

我想让用户的文件对话框可以轻松地选择文件或目录。

我的代码...

# 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

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

在这种情况下什么是正确的父母?

+0

你的代码是正确的。 PyCharm只是错了。 – ekhumoro

回答

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

可以通过禁用该检查只为需要的语句关闭这样的警告:

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

很多你在这里说的是错误的。方法定义之后的注释说明了这一切:'#真实签名未知;从__doc__'恢复。所以签名显然是错误的。在Qt和PyQt中,最确定的方法**是静态的,并且有一个很好的理由。 'QFileDialog'构造函数只能创建一个Qt的内置文件对话框的实例,而静态方法则使用该平台的本地文件对话框。因此传入'QFileDialog'的实例并不是正确的做法。 OP的代码是正确的; PyCharm是错误的。 – ekhumoro

+1

你说的正是我想在我的帖子中指出的。显然PyQt中的方法是静态的,否则它不起作用,但是如果你从PyCharm中检查了方法的声明,你不会看到它声明为静态的,所以PyCharm期望第一个参数是QFileDialog的一个实例,然后显示(威力)警告。我没有说PyQt是错误的,但是PyCharm检查是。 –

+0

好的。我主要质疑开始的部分“当你调用'QFileDialog.getOpenFileNames' ...”,这强烈暗示调用该方法作为一个实例方法,但并没有声明这实际上是错误的*做的事情。 (PS:你也说“看看PyQt5的源代码” - 但我不太清楚你指的是什么)。 – ekhumoro