2016-03-01 20 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

相關問題