Диалоговое окно файла Qt неправильно оказали и сбои

Я использую 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...
}

Я использую Qt 5.5 с Visual Studio 2013.

3 ответов


Я предполагаю, что есть проблема с каталога. Эта пустая строка, предоставленная как путь, может быть проблематичной. Попробуйте исправить это следующим образом:

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)"));

проблема в этом конкретном случае закончилась несовместимостью между Qt и программным обеспечением Dell Backup and Recovery, установленным на компьютере клиента, которое включало несовместимое расширение оболочки. Решение, которое я использовал, было удалить программное обеспечение резервного копирования и восстановления, но похоже, что пространство имен Qt также является альтернативой. Более подробная информация доступна в QTBUG-41416.


корнем вашей проблемы, похоже, является повреждение памяти. Чтобы найти его, установите Microsoft Application Verifier и настроить приложение с Basics\Heaps. Вы можете сделать это на своем компьютере, даже если исходная проблема не воспроизводилась. После этого попробуйте воспроизвести проблему, и я думаю, вы обнаружите повреждение памяти.

обновление
Теперь, когда проблема не воспроизводится на вашем компьютере, и вы говорите, что диалог зависает, я предлагаю следующие дополнительные шаги (вы можете сделать все сами в сеансе TeamViewer, чтобы сделать его проще)

  1. включить проверку приложений на компьютере клиента для вашего EXE. В качестве побочного эффекта, который включает трассировку кучи.
  2. захват (серия) дампов во время зависания. Имейте хотя бы один полный сброс среди серии. Например, вы можете сделать это с помощью Sysinternals Process Explorer. Анализируя их позже, вы сможете увидеть, что делает приложение. Не забудьте создать и сохранить PDB-файлы (debug информация) для вашего EXE (хотя я думаю, что висел бы вне вашего exe).