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