PyQt QFileDialog exec_很慢

时间:2012-11-19 17:46:35

标签: python qt pyqt qfiledialog

我正在使用自定义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_()

2 个答案:

答案 0 :(得分:3)

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

原生对话框可能比Qt更快或更慢,具体取决于使用的平台。

但是对于某些平台来说,似乎问题可能更严重。请参阅使用Qt 4.7 / 4.8影响Windows XP和Windows 7(以及其他版本)的this longstanding bug

<强>更新

要明确:

在Windows上,静态函数QFileDialog.getExistingDirectory打开本机&#34;浏览文件夹&#34;对话框,只允许选择单个目录。所以Qt无法提供 native 对话框来选择多个目录,因为Windows不提供。

另一个主要的选择是使用Qt自己的非本机文件对话框并按照this faq中的建议对其进行修补。但是,正如您已经发现的那样,由于底层实现中的错误,这一点目前具有令人烦恼的缓慢的重大缺点。

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

答案 1 :(得分:0)

默认的Qt文件浏览器对话框的性能非常慢。列出一个目录需要〜5s并选择一个文件需要~3s。添加&#34; DontUseNativeDialog&#34;选项完全解决了我的问题。

file_path = QtGui.QFileDialog.getSaveFileName( self, 'Title', path, "", "", QtGui.QFileDialog.DontUseNativeDialog )
print file_path