分享

PyQt中QFileDialog记录上次打开目录(历史目录)的方法

 盼盼2000_1983 2016-02-20

官方文档中该函数的具体声明是:
  • QString getOpenFileName (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), Options options = 0)
  • QString getOpenFileName (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), QString selectedFilter = None, Options options = 0)
  • (QString, QString) getOpenFileNameAndFilter (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), QString initialFilter = QString(), Options options = 0)
  • QStringList getOpenFileNames (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), Options options = 0)
  • QStringList getOpenFileNames (QWidget parent = None, QString caption = QString(), QString directory = QString(), QString filter = QString(), QString selectedFilter = None, Options options = 0)
在网上找了一些例子,都是忽略了selectedFilter和Options这两项,而directory这项设为一个指定的目录,一般为'./'当前目录。
这样就会导致一个问题,就是在需要使用文件对话框时,每次打开都是程序当前目录,而你想要的文件可能都在一个目录,但一般不在程序目录,所以每次都得手动找。
那么有没有解决办法呢?答案是肯定的,因为我们在使用其他程序时,打开文件对话框,都会默认打开上次使用的目录,也就是说它自带历史记录。
百度一下,有人说,当directory设为空字符串( ‘’),就会记录上次打开的文件。试了一下,没有成功。
于是google一下,在Stack Overflow上找到了这个问题的答案。

If you omit the dir argument (or pass in an empty string), the dialog should remember the last directory:

    filename = QtGui.QFileDialog.getOpenFileName(                   parent, 'Open File', '', 'Images (*.png *.xpm *.jpg)')

The tr function is used for translating user-visible strings. You can omit it if you won't ever be providing translations for your application.

EDIT:

It seems that the start directory may not be automatically remembered on all platforms/desktops, depending on whether you use the native dialog or not. If Qt's built-in dialog is used, the start directory should always be automatically remebered on all platforms (even between invokations of the application). To try the non-native dialog, do:

    filename = QtGui.QFileDialog.getOpenFileName(                   parent, 'Open File', '', 'Images (*.png *.xpm *.jpg)',None, QtGui.QFileDialog.DontUseNativeDialog)

Alternatively, you can use the QFileDialog constructor, which will always create a non-native dialog:

    dialog = QtGui.QFileDialog(parent)    dialog.setWindowTitle('Open File')    dialog.setNameFilter('Images (*.png *.xpm *.jpg)')    dialog.setFileMode(QtGui.QFileDialog.ExistingFile)if dialog.exec_() == QtGui.QDialog.Accepted:        filename = dialog.selectedFiles()[0]

 
原来是native dialog在作怪,需要在options参数中设置为QtGui.QFileDialog.DontUseNativeDialog 。改掉代码运行,发现程序报错,说是第5个参数,也就是selectedFilter不能为NoneTpye,再看官方文档,对selectedFilter的讲解不是很清楚,但是它的静态函数有两个版本,一个是没有selectedFilter参数的,难道默认用的是这个函数。将这个参数项去掉,运行一遍,果然就好使了。
filename = QtGui.QFileDialog.getOpenFileName(                   parent, 'Open File', '', 'Images (*.png *.xpm *.jpg)',QtGui.QFileDialog.DontUseNativeDialog)

总结起来,QFileDialog要使用历史记录,有三个需要注意的地方:
1、directory设为空字符串( ‘’);
2、要使用参数少的那个函数方法,即不含有selectedFilter;
3、最后一个参数(options)要设为QtGui.QFileDialog.DontUseNativeDialog 。









    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多