3

我正在使用自定义QFileDialog,因为我想选择多个目录。但是这个exec_功能很慢,我不知道为什么。我正在使用最新版本的 PyQt。

代码片段:

from PyQt4 import QtGui, QtCore, QtNetwork, uic

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi('gui.ui', self)            
        self.connect(self.multiPackerAddDirsBtn,
                     QtCore.SIGNAL('clicked()'), self.multiPackerAddDirs)

    def multiPackerAddDirs(self):
        dialog = QtGui.QFileDialog(self)
        dialog.setFileMode(QtGui.QFileDialog.Directory)
        dialog.setOption(QtGui.QFileDialog.ShowDirsOnly, True)
        dialogTreeView = dialog.findChild(QtGui.QTreeView)
        dialogTreeView.setSelectionMode(
            QtGui.QAbstractItemView.ExtendedSelection)
        if dialog.exec_():
            for dirname in dialog.selectedFiles():
                self.multiPackerDirList.addItem(str(dirname))
                print(str(dirname))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()
4

2 回答 2

4

构造QFileDialog函数创建一个 Qt 对话框,而静态函数(如getSaveFileName)将创建一个原生对话框(除非DontUseNativeDialog选项设置为True)。

根据使用的平台,本机对话框可能比 Qt 更快或更慢。

但是,对于某些平台,问题似乎更为严重。查看这个长期存在的错误,它影响带有 Qt 4.7 / 4.8 的 Windows XP 和 Windows 7(以及其他)。

更新

只是要清楚:

在 Windows 上,静态函数QFileDialog.getExistingDirectory打开本机“浏览文件夹”对话框,该对话框只允许选择单个目录。所以 Qt 不能提供用于选择多个目录的本机对话框,因为 Windows 不提供。

另一个主要替代方法是使用 Qt 自己的非本机文件对话框并按照此 faq中的建议对其进行猴子补丁。但是,正如您已经发现的那样,由于底层实现中的错误,这目前具有令人讨厌的缓慢的显着缺点。

剩下的唯一选择是编写您自己的目录列表对话框,或者尝试考虑另一种解决您当前问题的方法(即不使用文件对话框)。

于 2012-11-19T21:23:43.280 回答
0

从默认的 Qt 文件浏览器对话框中,我的性能非常缓慢。列出一个目录大约需要 5 秒,选择一个文件大约需要 3 秒。添加“DontUseNativeDialog”选项完全解决了我的问题。

file_path = QtGui.QFileDialog.getSaveFileName( self, 'Title', path, "", "", QtGui.QFileDialog.DontUseNativeDialog )
print file_path
于 2014-04-08T16:50:31.637 回答