3

I'm using a custom QFileDialog because I want to select multiple directories. But the exec_ function is very slow, and I can't figure out why. I'm using the newest version of PyQt.

Code Snippet:

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は、ネイティブの「フォルダの参照」ダイアログを開きます。このダイアログでは、1 つのディレクトリのみを選択できます。そのため、Qt は複数のディレクトリを選択するためのネイティブダイアログを提供できません。Windows では提供されないためです。

その他の主な代替手段は、この faqで提案されているように、Qt 独自の非ネイティブ ファイル ダイアログとモンキー パッチを使用することです。ただし、すでにお気づきのように、これには現在、基盤となる実装のバグが原因で非常に遅くなるという重大な欠点があります。

残っている唯一の選択肢は、独自のディレクトリ リスト ダイアログを作成するか、差し迫った問題を解決する別の方法 (つまり、ファイル ダイアログを使用しない) を考えることです。

于 2012-11-19T21:23:43.280 に答える