【问题标题】:PyQt QFileDialog exec_ is slowPyQt QFileDialog exec_ 很慢
【发布时间】:2014-04-09 00:50:31
【问题描述】:

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

【问题讨论】:

  • 你在什么平台上?文件对话框是否总是很慢,还是仅在您使用已发布的代码时?
  • 我在 Windows 7 上。如果我使用像 getSaveFileName 这样的预定义方法,它会很快,但如果我使用 dialog = QtGui.QFileDialog(self) 创建自定义对话框并使用 dialog.exec_() 会很慢见鬼去吧。

标签: python qt pyqt qfiledialog


【解决方案1】:

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

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

不过,对于某些平台,问题似乎更为严重。请参阅this longstanding bug,它会影响带有 Qt 4.7 / 4.8 的 Windows XP 和 Windows 7(以及其他)。

更新

要明确一点:

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

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

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

【讨论】:

  • 我尝试将 DontUseNativeDialog 设为 False,但没有效果。有没有另一种方法可以创建一个可以选择多个目录的文件对话框?
  • @Ahsous。关于这一点没有太多可说的,但我已经尽我所能更新了我的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多