Qt文件对话框渲染不正确和崩溃

时间:2015-10-08 05:50:58

标签: c++ qt visual-c++

我正在使用QFileDialog::getOpenFileName函数来打开文件。但是,在运行Windows 7的客户端计算机上,这会显示一个损坏的打开文件对话框,如屏幕截图所示,或者崩溃整个应用程序。

Corrupted Dialog

我用来打开文件对话框的代码是:

void MainWindow::on_action_triggered() {
    auto filename = QFileDialog::getSaveFileName(this, "Generate Report", "", "CSV files (*.csv)");

    if (filename.isEmpty()) {
        return;
    }

    // Do operations on filename...
}

我在Visual Studio 2013中使用Qt 5.5。

3 个答案:

答案 0 :(得分:6)

此特定情况下的问题最终导致Qt与客户端计算机上安装的Dell备份和恢复软件不兼容,其中包括不兼容的shell扩展。我使用的解决方案是删除备份和恢复软件,但听起来像命名空间Qt也是一种替代方案。有关详细信息,请参阅QTBUG-41416

答案 1 :(得分:5)

我猜测目录存在问题。作为路径提供的这个空字符串可能有问题。 尝试以这种方式修复:

auto filename = QFileDialog::getSaveFileName(this, 
                                             tr("Generate Report"),
                                             QString(),
                                             tr("CSV files (*.csv)"));
// or this way
auto filename = QFileDialog::getSaveFileName(this,
                                             tr("Generate Report"),
                                             QDir::home().absolutePath(),
                                             tr("CSV files (*.csv)"));

答案 2 :(得分:2)

问题的根源似乎是内存损坏。要找到它,请安装Microsoft Application Verifier并使用Basics\Heaps配置您的应用。您可以在自己的计算机上执行此操作,即使原始问题无法重现。之后,尝试重现问题,我猜你会发现你的内存损坏。

<强>更新
既然问题没有在您的机器上重现并且您说对话框已挂起,我建议执行以下附加步骤(您可以在TeamViewer会话中自行完成所有操作以使其更容易)

  1. 在客户的计算机上为您的EXE启用Application Verifier。作为副作用,它可以启用堆跟踪。
  2. 在挂起期间捕获(系列)转储。在该系列中至少有一个完整的转储。例如,您可以使用SysInternals Process Explorer执行此操作。稍后分析它们,您将能够看到应用程序正在做什么。不要忘记为EXE生成和保存PDB文件(调试信息)(虽然我认为挂起的文件不在你的exe之外)。