我在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_())
父主窗口中有许多按钮,其中一个按钮显示文件对话框。
在这种情况下,适当的父母是什么?
答案 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
不是声明为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
)是QFileDialog
的一个实例,因此会抛出警告。
您可以通过仅针对所需语句禁用检查来关闭此类警告:
# noinspection PyTypeChecker,PyCallByClass
file_names = QFileDialog.getOpenFileNames(self, "Select one or more files to open", "C:/Windows", "")
print(file_names)