Диалоговое окно файла Qt неправильно оказали и сбои
Я использую QFileDialog::getOpenFileName
функция для открытия файла. Однако на компьютере клиента под управлением Windows 7 отображается поврежденный диалог открытия файла, как показано на скриншоте, или происходит сбой всего приложения.
код, который я использую для открытия диалогового окна файла:
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, чтобы сделать его проще)
- включить проверку приложений на компьютере клиента для вашего EXE. В качестве побочного эффекта, который включает трассировку кучи.
- захват (серия) дампов во время зависания. Имейте хотя бы один полный сброс среди серии. Например, вы можете сделать это с помощью Sysinternals Process Explorer. Анализируя их позже, вы сможете увидеть, что делает приложение. Не забудьте создать и сохранить PDB-файлы (debug информация) для вашего EXE (хотя я думаю, что висел бы вне вашего exe).