无法使用 Python 2.7、PyQt 4.11 和 Windows 7 64 位为 QFileDialog 设置默认过滤器
Posted
技术标签:
【中文标题】无法使用 Python 2.7、PyQt 4.11 和 Windows 7 64 位为 QFileDialog 设置默认过滤器【英文标题】:Unable to set default filter for QFileDialog using Python 2.7, PyQt 4.11, and Windows 7 64-bit 【发布时间】:2016-12-20 21:16:51 【问题描述】:我看到其他几个posts(和another)试图做我在这里要求的事情,但这仍然不起作用。我也一直在引用这个documentation 并在 python 控制台中检查了帮助(QFileDialog.getSaveFileName)。不确定它是否与环境有关,或者我的代码忽略了某些东西。我在 Windows 7 64 位上使用 Python 2.7 和 PyQt 4.11.4。
我已经尝试过直接对象构造和静态方法(如thread 中所建议的那样),但以下代码均不允许我为文件对话框设置默认过滤器或初始过滤器。文件对话框打开时会选择第一个文件类型 (pdf),大概是因为它是列表中的第一个。
if self.dlg.formatBox.currentIndex() == 1 : # if extension is pdf
dir = settings.value('/UI/lastSaveAsPdfFile')
else:
dir = settings.value('/UI/lastSaveAsImageDir')
defaultFilter = self.tr(self.dlg.formatBox.currentText())
#defaultFilter = "TIF format (*.tif *.TIF)"
#(folderDialog, selectedFilter) = QFileDialog.getSaveFileNameAndFilter(
#None,
#'Impression',
#dir,
#"PDF format (*.pdf *.PDF);;JPG format (*.jpg *.JPG);;JPEG format (*.jpeg *.JPEG)');;TIF format (*.tif *.TIF);;TIFF format (*.tiff *.TIFF);;PNG format (*.png *.PNG);;BMP format (*.bmp *.BMP);;ICO format (*.ico *.ICO);;PPM format (*.ppm *.PPM);;XBM format (*.xbm *.XBM);;XPM format (*.xpm *.XPM)",
#defaultFilter
#)
#folderDialog = QFileDialog.getSaveFileName(
#None,
#'Impression',
#dir,
#"PDF format (*.pdf *.PDF);;JPG format (*.jpg *.JPG);;JPEG format (*.jpeg *.JPEG)');;TIF format (*.tif *.TIF);;TIFF format (*.tiff *.TIFF);;PNG format (*.png *.PNG);;BMP format (*.bmp *.BMP);;ICO format (*.ico *.ICO);;PPM format (*.ppm *.PPM);;XBM format (*.xbm *.XBM);;XPM format (*.xpm *.XPM)",
#defaultFilter
#)
folderDialog = QFileDialog(None, 'Impression', dir, "PDF format (*.pdf *.PDF);;JPG format (*.jpg *.JPG);;JPEG format (*.jpeg *.JPEG)');;TIF format (*.tif *.TIF);;TIFF format (*.tiff *.TIFF);;PNG format (*.png *.PNG);;BMP format (*.bmp *.BMP);;ICO format (*.ico *.ICO);;PPM format (*.ppm *.PPM);;XBM format (*.xbm *.XBM);;XPM format (*.xpm *.XPM)")
folderDialog.selectNameFilter(defaultFilter)
folderDialog.exec_()
print 'Default Filter: '.format(defaultFilter)
self.dlg.formatBox 是父窗口中的一个组合框,用户可以在其中选择所需的格式。我想在打开文件对话框时检索此信息并将默认过滤器设置为此格式。以显示的方式运行代码,选择第 6 个过滤器选项 (png)(在 self.dlg.formatBox 中)给我以下对话框 - 仍然是 pdf:
以下内容打印到控制台:
默认过滤器:格式 PNG (*.png *.PNG)
UPDATE 已修改 defaultFilter 变量以考虑问题 cmets。
【问题讨论】:
defaultFilter
不在您的任何过滤器列表中,因此显然不能预先选择它。如第一个链接答案中所述,QFileDialog
构造函数示例 确实 工作正常。但是,静态方法似乎在 PyQt4 或 PySide 中都不能正常工作。所有方法在 PyQt5 中都可以正常工作。
@ekhumoro 好的,所以专注于直接构造方法——你能看到它仍然出错的地方吗?我已经编辑了一些问题
@ekhumoro 还认为 defaultFilter 值是一个经过深思熟虑的测试,以确定我的问题是否与格式有关。其他 defaultFilter 值(已注释掉)也不起作用
请更仔细地检查您的测试 - 您的任何defaultFilter
字符串都不在您的任何过滤器列表中。我建议您复制列表中的一个实际过滤器以用于测试。
@ekhumoro self.tr(self.dlg.formatBox.currentText()) 在过滤器列表中,因为 formatBox 包含过滤器列表项。对错别字表示歉意,我正在重新输入其中的一些内容-编码计算机上没有互联网...您认为这确实可能是格式问题?
【参考方案1】:
在我当前的环境(PyQt 4.11 和 Python 2.7)中,静态方法选项似乎不是任何选项——显然它们已损坏。
直接的对象构造是要走的路。这最初不起作用,因为默认过滤器与文件对话框设置过滤器不匹配 - 这些需要完全匹配,否则文件对话框将无法设置默认过滤器。
【讨论】:
【参考方案2】:我使用了这个方法,这样你就可以在pyqt5中的DialogBox中添加尽可能多的扩展类型。
filenames, _ = QFileDialog.getOpenFileNames(caption='Open a file',
directory='',
filter='Python Files (*.py)\nText Files (*.txt)\n'
'CSS Files (*.css)\nJSON File (*.json)',
options=options)
【讨论】:
以上是关于无法使用 Python 2.7、PyQt 4.11 和 Windows 7 64 位为 QFileDialog 设置默认过滤器的主要内容,如果未能解决你的问题,请参考以下文章
在 sip install 成功后安装 PyQt(用于 pyuic4):错误:PyQt-x11-gpl-4.11 install
Python 2.7 PyQt4 将主窗口文件添加到另一个主窗口的选项卡