4.9 KiB
CSV加载闪退问题 - 完整修复报告
问题诊断
问题现象: "Load from CSV" 功能在加载CSV文件时导致程序闪退
环境: Windows 10, MINGW64, Qt GUI应用
根本原因
经过深入分析代码,确定主要原因为:
1. Windows路径编码问题 ⭐⭐⭐(主要原因)
位置: examples/qt_gui_demo.cpp 第309行和第326行
问题:
custom_path_.loadFromCSV(filename.toStdString(), true)
在Windows MINGW环境下,QString::toStdString() 对包含中文或特殊字符的路径转换不正确,导致:
- 文件无法打开
- 路径字符串损坏
- 程序崩溃
解决方案:
// 使用toLocal8Bit()替代toStdString()
std::string filepath = filename.toLocal8Bit().constData();
custom_path_.loadFromCSV(filepath, true)
2. 单点路径处理不明确
位置: src/path_curve.cpp 第106-134行
问题: 当CSV文件只包含1个数据点时,该点的theta和kappa未被明确处理
解决方案: 添加注释说明单点情况保持原值,避免混淆
3. 异常信息不够详细
位置: src/path_curve_custom.cpp 第48-52行
问题: 异常捕获时未记录详细错误信息
解决方案: 输出异常的what()内容以便诊断
已应用的修复
修复清单
✅ 文件1: examples/qt_gui_demo.cpp
- 第309行: 使用
toLocal8Bit().constData()替代toStdString() - 第326行: 同上
- 添加了解释性注释
✅ 文件2: src/path_curve.cpp
- 第133行: 添加单点处理说明注释
✅ 文件3: src/path_curve_custom.cpp
- 第49行: 捕获异常时获取详细信息
- 第50行: 输出异常的
what()内容
备份文件
所有原始文件已备份:
./examples/qt_gui_demo.cpp.backup
./src/path_curve.cpp.backup
./src/path_curve_custom.cpp.backup
代码对比
修复前后对比
qt_gui_demo.cpp (第309行)
修复前:
if (custom_path_.loadFromCSV(filename.toStdString(), true)) {
修复后:
// 修复: 使用toLocal8Bit以正确处理Windows路径(包括中文路径)
if (custom_path_.loadFromCSV(filename.toLocal8Bit().constData(), true)) {
path_curve_custom.cpp (第49-50行)
修复前:
} catch (const std::exception&) {
std::cerr << "Error parsing line " << line_num << ": " << line << std::endl;
修复后:
} catch (const std::exception& e) {
std::cerr << "Error parsing line " << line_num << ": " << line << " (" << e.what() << ")" << std::endl;
下一步操作
⚠️ 重要:重新编译
注意: 当前 agv_qt_gui.exe 正在运行(PID: 2996),需要先关闭程序才能重新编译。
步骤1: 关闭程序
- 方法A: 在任务管理器中结束
agv_qt_gui.exe进程 - 方法B: 在Windows命令提示符中运行:
taskkill /F /IM agv_qt_gui.exe
步骤2: 重新编译
cd build
cmake --build . --config Release
步骤3: 测试修复
运行新编译的程序:
./build/Release/agv_qt_gui.exe
测试建议
修复后请测试以下场景(按优先级排序):
高优先级测试
- ✓ 加载包含中文路径的CSV文件(最重要)
- ✓ 加载存放在中文文件夹中的CSV文件
- ✓ 加载包含空格的路径
常规测试
- ✓ 加载只有2列(x, y)的CSV文件
- ✓ 加载完整4列(x, y, theta, kappa)的CSV文件
- ✓ 加载只有1个数据点的CSV文件
错误处理测试
- ✓ 加载空CSV文件(只有header)
- ✓ 加载格式错误的CSV文件
- ✓ 加载不存在的文件
技术说明
QString编码转换对比
| 方法 | Windows行为 | 适用场景 | 问题 |
|---|---|---|---|
toStdString() |
使用系统默认编码 | 纯ASCII路径 | 中文路径乱码或崩溃 |
toLocal8Bit().constData() |
使用本地编码(GBK/ANSI) | Windows文件路径 | ✓ 正确处理中文 |
toUtf8().constData() |
使用UTF-8编码 | 跨平台文本 | Windows路径可能有问题 |
结论: 在Windows上处理文件路径时,应使用 toLocal8Bit()
预期效果
修复后,程序应该:
- ✓ 不再因路径问题而崩溃
- ✓ 正确处理中文路径和特殊字符
- ✓ 提供详细的错误信息(如果CSV格式有问题)
- ✓ 更稳定的用户体验
文档索引
相关文档:
FIX_SUMMARY.md- 详细修复总结CSV_LOAD_FIX.md- 修复方案详解BUILD_INSTRUCTIONS.md- 编译说明
技术支持
如果问题仍然存在,请检查:
- 是否已重新编译(非常重要!)
- CSV文件编码(建议UTF-8 without BOM)
- CSV格式是否正确(逗号分隔,至少2列数值)
- 控制台是否有详细错误信息
- 文件是否被其他程序占用
修复日期: 2025-11-14 修复状态: ✅ 代码已修复,等待重新编译和测试 影响范围: CSV文件加载功能 风险评估: 低风险(仅修改字符串转换方式和添加注释)