QT解析文本框数据——概述
QT解析文本框数据
// 解析业务数据
bool Widget::parseBusinessData()
{businessData.clear();weights.clear();// 解析业务数据QString dataText = ui->textEdit->toPlainText();QRegularExpression businessRegExp(R"((\d+):([^;]+);)");QRegularExpression timeValueRegExp(R"((\d+)-(\d+))");QRegularExpressionMatchIterator businessIt = businessRegExp.globalMatch(dataText);while (businessIt.hasNext()) {QRegularExpressionMatch businessMatch = businessIt.next();int businessId = businessMatch.captured(1).toInt();QString timeValueStr = businessMatch.captured(2);QList<QPair<int, int>> timeValues;QStringList pairs = timeValueStr.split(',');for (const QString &pair : pairs) {QRegularExpressionMatch tvMatch = timeValueRegExp.match(pair);if (tvMatch.hasMatch()) {int timePoint = tvMatch.captured(1).toInt();int workload = tvMatch.captured(2).toInt();timeValues.append(qMakePair(timePoint, workload));}}if (!timeValues.isEmpty()) {businessData[businessId] = timeValues;}}// 解析权重数据QString weightsText = ui->lineEditWorksValue->text();QRegularExpression weightRegExp(R"((\d+):(\d+);)");QRegularExpressionMatchIterator weightIt = weightRegExp.globalMatch(weightsText);while (weightIt.hasNext()) {QRegularExpressionMatch weightMatch = weightIt.next();int businessId = weightMatch.captured(1).toInt();int weight = weightMatch.captured(2).toInt();weights[businessId] = weight;}// 验证数据if (businessData.isEmpty()) {QMessageBox::warning(this, "错误", "未解析到有效业务数据");return false;}// 为没有设置权重的业务设置默认权重1for (int businessId : businessData.keys()) {if (!weights.contains(businessId)) {weights[businessId] = 1;}}return true;
}
概述
这段代码是Qt框架下的C++函数,用于解析界面输入的业务数据和权重数据。下面从功能、结构、正则表达式、数据处理和验证等方面进行分析:
功能概述
这个函数主要完成以下工作:
- 清空之前的业务数据和权重数据
- 从界面获取业务数据文本并解析
- 从界面获取权重数据文本并解析
- 验证数据有效性
- 为没有设置权重的业务设置默认权重
代码结构
函数分为四个主要部分:
- 初始化:清空存储数据的容器
- 业务数据解析:使用正则表达式提取业务ID和时间-工作量对
- 权重数据解析:使用正则表达式提取业务ID和对应的权重值
- 数据验证与处理:确保有有效数据,并为缺失权重的业务设置默认值
正则表达式分析
businessRegExp
:R"((\d+):([^;]+);)"
- 匹配格式为"数字:内容;"的字符串
- 第一个捕获组是业务ID,第二个捕获组是业务数据内容
timeValueRegExp
:R"((\d+)-(\d+))"
- 匹配格式为"数字-数字"的字符串
- 用于提取时间点和对应的工作量
weightRegExp
:R"((\d+):(\d+);)"
- 匹配格式为"数字:数字;"的字符串
- 用于提取业务ID和对应的权重值
数据处理流程
- 业务数据处理:
- 从文本中提取每个业务条目
- 对每个业务条目,进一步提取其中的时间-工作量对
- 将有效数据存入
businessData
映射中,键为业务ID,值为时间-工作量对列表
- 权重数据处理:
- 从文本中提取每个权重条目
- 将业务ID和对应的权重存入
weights
映射
- 数据验证与补充:
- 检查是否有有效业务数据
- 为没有明确设置权重的业务补充默认权重值1
优点
- 结构清晰,各部分功能明确
- 使用正则表达式进行数据提取,提高了解析的准确性和灵活性
- 对可能缺失的权重数据进行了默认值处理,增强了程序的健壮性
- 对无效数据情况给出了明确的提示
改进建议
- 错误处理增强:
- 可以增加对解析过程中出现的其他错误情况的处理,例如重复的业务ID
- 可以记录日志,方便调试和问题追踪
- 用户反馈优化:
- 可以提供更详细的错误信息,例如指出具体哪部分数据格式不正确
- 性能优化:
- 如果数据量非常大,可以考虑优化正则表达式或解析算法
- 代码复用:
- 两个正则表达式匹配的循环结构相似,可以考虑提取成通用函数减少代码冗余
潜在问题
- 如果输入的业务ID不是有效的整数,
toInt()
会返回0,可能导致数据混乱 - 没有处理业务ID重复的情况,后面的数据会覆盖前面的
- 没有对时间点和工作量的数值范围进行有效性检查
- 如果权重文本中包含重复的业务ID,后面的权重值会覆盖前面的
总体而言,这段代码实现了基本的数据解析功能,但在错误处理和数据验证方面还有提升空间。