QT 5.2.0打开文件对话框速度慢

4

在调用getOpenFileName函数时,很常见的情况是函数会挂起约5秒钟左右。实际调用方式如下:

  QString fileName = QFileDialog::getOpenFileName(this,
     tr("Open XML"),"D:\\xml_reader\\data\\",tr("XML Files (*.xml *.*)"));

我要发送的文件夹只包含一个文件,所以不是因为文件数量的问题。 我已经在Debug和Release模式下都尝试过了,它们都遇到了同样的问题。

在网上查看时,我发现其他人也遇到了类似的问题,但没有解决方案。 我以前使用过其他版本的QT,从未遇到过这个问题。


D: 是网络驱动器吗?进入 getOpenFileName() 查看是什么在影响它。 - fxam
我发现如果GUI线程有其他需要大量关注的任务,Qt的文件对话框就会变得无法使用。这不是事实吗? - hluk
尚未能找到问题的根本原因。 - Gustavo Litovsky
我在使用Qt5.5开发Mac OS X El Capitan应用时也遇到了同样的延迟问题,即使进行了优化,在每次应用程序执行时第一次打开文件对话框都会出现这个问题。目前还没有已知的解决方案。 - remikz
2个回答

2
我最近遇到了同样的问题,解决方法是从Windows文件资源管理器左侧的快速访问列表中删除一个无法访问的网络位置。这个网络位置已经无法访问了。
在选择文件和点击取消或关闭按钮时,它会在发布模式和调试模式下都出现延迟。
对话框会很快地打开,但在关闭对话框后,我的应用程序会在延迟2-5秒后才继续执行下一条指令。我通过在调试中逐步执行代码并在发布版本中打开下一行视觉提示来确认这一点。
最终帮助我意识到问题的是,在完全不同的应用程序中再次出现了相同的问题。

-1
  1. 不要在调试器下运行您的应用程序。
  2. 当您加载应用程序时,可能会强制加载 Comdlg32.dll。

p.s. QT - 是 QuickTime,您正在使用 Qt

针对 @JohnNeuhaus 的特殊“摘要”更新:

:为什么 getOpenFileName 很慢?

:原因:Comdlg32.dll 是延迟加载库,它在第一次 getOpenFileName 调用时开始加载。这个加载时间很长。如果连接了调试器(因为需要加载 .pdb),动态链接时间可能会增加。

解决方法:在应用程序启动时直接加载 `Comctl32.dll'。

QLibrary lib( "Comctl32.dll" );`
lib.setLoadHints( QLibrary::ResolveAllSymbolsHint );
lib.load();

我以前在调试器下运行过Qt应用程序,没有这个问题。这一定是在Qt 5.2或4.8之后引入的。 - Gustavo Litovsky
1
你错了。在qt4和qt5上,第一个对话框显示时都有相同的延迟。我进行了研究 ;) - Dmitry Sazonov
1
@JohnNeuhaus 我们正在谈论性能分析,而不是调试。您必须在发布版本下进行性能分析(开启代码优化),并且不能使用调试器。否则,性能分析结果将无效。客户不会使用带有打开调试器的调试版本应用程序。 - Dmitry Sazonov
根据问题,我们并没有具体讨论哪一个。发帖者只是简单地陈述了函数调用很慢,并尝试了Debug和Release两种模式。 - John Neuhaus
@JohnNeuhaus 我们正在讨论真正的原因,请不要改变问题的背景。根据优先级,总结(导致速度慢的原因)如下:1)Comctl32.dll 的动态链接所需时间;2)调试器尝试加载 .pdb 文件;3)编译器优化。 - Dmitry Sazonov
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接