使用 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)
我正在 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)