无法使用 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 设置默认过滤器的主要内容,如果未能解决你的问题,请参考以下文章

为 Python 2.7 安装 Qt5 和 PyQt5

在 sip install 成功后安装 PyQt(用于 pyuic4):错误:PyQt-x11-gpl-4.11 install

Python 2.7 PyQt4 将主窗口文件添加到另一个主窗口的选项卡

为啥我必须将 Qt Designer 2.7 与 Python 2.7 一起使用?

pycharm + pyqt4编写图形用户界面环境搭建

ubuntu14.04下PyCharm使用OPenCV2.4.11