This commit is contained in:
CaiXiang
2025-11-14 16:09:58 +08:00
commit af65c2425d
74 changed files with 14650 additions and 0 deletions

120
docs/fixes/FIX_SUMMARY.md Normal file
View File

@@ -0,0 +1,120 @@
# CSV加载闪退问题修复总结
## 修复完成时间
2025-11-14
## 问题描述
"Load from CSV" 功能在加载CSV文件时导致程序闪退
## 根本原因分析
经过详细代码审查,发现以下问题:
1. **Windows路径编码问题**(主要原因)
-`examples/qt_gui_demo.cpp` 中使用 `QString::toStdString()` 转换文件路径
- 在Windows MINGW环境下当文件路径包含中文或特殊字符时这种转换会产生错误的编码
- 导致文件无法正确打开或程序崩溃
2. **单点路径处理不完整**
-`src/path_curve.cpp``setPathPoints` 函数中单点情况下theta和kappa未明确处理
- 虽然不会直接导致崩溃,但可能引发后续问题
3. **异常信息不够详细**
- CSV解析异常信息不够详细难以定位问题
## 已应用的修复
### 修复1: Windows路径编码问题
**文件**: `examples/qt_gui_demo.cpp`
- **第309行**: 将 `filename.toStdString()` 改为 `filename.toLocal8Bit().constData()`
- **第326行**: 将 `filename.toStdString()` 改为 `filename.toLocal8Bit().constData()`
- **效果**: 正确处理Windows路径包括中文路径和特殊字符
### 修复2: 改进单点路径处理
**文件**: `src/path_curve.cpp`
- **第133行**: 添加注释说明单点情况的处理逻辑
- **效果**: 明确单点情况下保持原有theta和kappa值避免越界访问
### 修复3: 改进异常处理
**文件**: `src/path_curve_custom.cpp`
- **第49行**: 将 `catch (const std::exception&)` 改为 `catch (const std::exception& e)`
- **第50行**: 错误消息中添加 `e.what()` 以显示详细异常信息
- **效果**: 提供更详细的错误诊断信息
## 修改的文件列表
1. `examples/qt_gui_demo.cpp` - 修复路径编码问题
2. `src/path_curve.cpp` - 改进单点处理
3. `src/path_curve_custom.cpp` - 改进异常处理
## 备份文件
所有修改前的文件已备份:
- `examples/qt_gui_demo.cpp.backup`
- `src/path_curve.cpp.backup`
- `src/path_curve_custom.cpp.backup`
## 下一步操作
需要重新编译项目以应用这些修复:
```bash
cd build
# 清理旧的构建(可选)
cmake --build . --target clean
# 重新构建Release版本
cmake --build . --config Release
# 或者构建Debug版本用于调试
cmake --build . --config Debug
```
## 测试建议
修复后建议测试以下场景:
1. ✓ 加载包含中文路径的CSV文件
2. ✓ 加载纯英文路径的CSV文件
3. ✓ 加载只有2列x, y的CSV文件
4. ✓ 加载完整4列x, y, theta, kappa的CSV文件
5. ✓ 加载只有1个数据点的CSV文件
6. ✓ 加载空的CSV文件只有header
7. ✓ 加载格式错误的CSV文件测试错误处理
## 技术细节
### QString::toLocal8Bit() vs toStdString()
- `toStdString()`: 使用系统默认编码在Windows上可能导致编码问题
- `toLocal8Bit()`: 使用本地8位编码Windows上是ANSI/GBK更适合处理文件路径
- `.constData()`: 返回const char*指针可以直接用于std::string构造
### 修复的关键代码对比
**修复前**:
```cpp
if (custom_path_.loadFromCSV(filename.toStdString(), true)) {
```
**修复后**:
```cpp
// 修复: 使用toLocal8Bit以正确处理Windows路径包括中文路径
if (custom_path_.loadFromCSV(filename.toLocal8Bit().constData(), true)) {
```
## 预期效果
修复后,程序应该能够:
1. 正确加载包含中文路径的CSV文件
2. 正确处理各种格式的CSV文件2列、3列、4列
3. 在遇到错误时显示详细的错误信息而不是直接崩溃
4. 提供更好的用户体验和错误提示
## 附加说明
如果问题仍然存在,可以检查以下内容:
1. CSV文件编码是否为UTF-8建议使用UTF-8 without BOM
2. CSV文件格式是否正确逗号分隔每行至少2个数值
3. 查看控制台输出的详细错误信息
4. 检查是否有其他程序占用文件