QT解析文本框数据——概述

QT解析文本框数据

cpp 复制代码
// 解析业务数据
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;
    }

    // 为没有设置权重的业务设置默认权重1
    for (int businessId : businessData.keys()) {
        if (!weights.contains(businessId)) {
            weights[businessId] = 1;
        }
    }

    return true;
}

概述

这段代码是Qt框架下的C++函数,用于解析界面输入的业务数据和权重数据。下面从功能、结构、正则表达式、数据处理和验证等方面进行分析:

功能概述

这个函数主要完成以下工作:

  1. 清空之前的业务数据和权重数据
  2. 从界面获取业务数据文本并解析
  3. 从界面获取权重数据文本并解析
  4. 验证数据有效性
  5. 为没有设置权重的业务设置默认权重

代码结构

函数分为四个主要部分:

  1. 初始化:清空存储数据的容器
  2. 业务数据解析:使用正则表达式提取业务ID和时间-工作量对
  3. 权重数据解析:使用正则表达式提取业务ID和对应的权重值
  4. 数据验证与处理:确保有有效数据,并为缺失权重的业务设置默认值

正则表达式分析

  • businessRegExpR"((\d+):([^;]+);)"
    • 匹配格式为"数字:内容;"的字符串
    • 第一个捕获组是业务ID,第二个捕获组是业务数据内容
  • timeValueRegExpR"((\d+)-(\d+))"
    • 匹配格式为"数字-数字"的字符串
    • 用于提取时间点和对应的工作量
  • weightRegExpR"((\d+):(\d+);)"
    • 匹配格式为"数字:数字;"的字符串
    • 用于提取业务ID和对应的权重值

数据处理流程

  1. 业务数据处理
    • 从文本中提取每个业务条目
    • 对每个业务条目,进一步提取其中的时间-工作量对
    • 将有效数据存入businessData映射中,键为业务ID,值为时间-工作量对列表
  2. 权重数据处理
    • 从文本中提取每个权重条目
    • 将业务ID和对应的权重存入weights映射
  3. 数据验证与补充
    • 检查是否有有效业务数据
    • 为没有明确设置权重的业务补充默认权重值1

优点

  • 结构清晰,各部分功能明确
  • 使用正则表达式进行数据提取,提高了解析的准确性和灵活性
  • 对可能缺失的权重数据进行了默认值处理,增强了程序的健壮性
  • 对无效数据情况给出了明确的提示

改进建议

  1. 错误处理增强
    • 可以增加对解析过程中出现的其他错误情况的处理,例如重复的业务ID
    • 可以记录日志,方便调试和问题追踪
  2. 用户反馈优化
    • 可以提供更详细的错误信息,例如指出具体哪部分数据格式不正确
  3. 性能优化
    • 如果数据量非常大,可以考虑优化正则表达式或解析算法
  4. 代码复用
    • 两个正则表达式匹配的循环结构相似,可以考虑提取成通用函数减少代码冗余

潜在问题

  • 如果输入的业务ID不是有效的整数,toInt()会返回0,可能导致数据混乱
  • 没有处理业务ID重复的情况,后面的数据会覆盖前面的
  • 没有对时间点和工作量的数值范围进行有效性检查
  • 如果权重文本中包含重复的业务ID,后面的权重值会覆盖前面的

总体而言,这段代码实现了基本的数据解析功能,但在错误处理和数据验证方面还有提升空间。

相关推荐
王道长服务器 | 亚马逊云29 分钟前
帝国CMS + AWS:老牌内容系统的新生之路
服务器·网络·数据库·云计算·aws
李慕婉学姐1 小时前
Springboot的民宿管理系统的设计与实现29rhm9uh(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
十五年专注C++开发1 小时前
Qt-VLC: 一个集成VLC的开源跨平台媒体播放库
开发语言·qt·媒体·libvlc·vlc-qt
LB21122 小时前
Redis黑马点评 Feed流
数据库·redis·缓存
喝杯牛奶丶3 小时前
MySQL隔离级别:大厂为何偏爱RC?
java·数据库·mysql·面试
一 乐3 小时前
二手车销售|汽车销售|基于SprinBoot+vue的二手车交易系统(源码+数据库+文档)
java·前端·数据库·vue.js·后端·汽车
Databend3 小时前
BendSQL v0.30.3 Web UI 功能介绍
数据库
gAlAxy...4 小时前
Spring 从 0 → 1 保姆级笔记:IOC、DI、多配置、Bean 生命周期一次讲透
数据库·sqlserver
苦学编程的谢4 小时前
Redis_5_单线程模型
数据库·redis·缓存
xuejianxinokok4 小时前
可能被忽略的 pgvector 各种坑
数据库·后端