You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将特定格式文本文件数据加载至自定义QAbstractTableModel?

正确加载结构化文本到自定义QAbstractTableModel的实现方案
  • 替换拆分逻辑:按标题精准匹配而非全局拆分
    放弃\W+全局拆分的方式,改用正则表达式匹配每行中TitleX: 内容的结构化单元,这样能完整保留每个字段的词组内容,不会被空格或非单词字符打断。

    适用的正则模式:(Title\d+):\s*(.*?)(?=\sTitle\d+:|$)

    • (Title\d+):捕获标题标识(如Title1、Title2)
    • \s*:匹配标题冒号后的任意空白字符
    • (.*?):非贪婪捕获标题对应的完整内容,直到下一个TitleX:开头或行尾
    • (?=\sTitle\d+:|$):正向预查,确保内容截止到下一个标题或行结束
  • Qt中具体实现代码
    在FileManager::readDataFromFile中替换解析逻辑:

    #include <QRegularExpression>
    #include <QFile>
    #include <QTextStream>
    
    bool FileManager::readDataFromFile(const QString& filePath, YourCustomModel* model) {
        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            return false;
        }
    
        QTextStream in(&file);
        QRegularExpression re(R"((Title\d+):\s*(.*?)(?=\sTitle\d+:|$))");
        QRegularExpressionMatchIterator matchIter;
    
        while (!in.atEnd()) {
            QString line = in.readLine().trimmed();
            if (line.isEmpty()) continue;
    
            matchIter = re.globalMatch(line);
            DataItems dataItem; // 你的DataItems结构体实例
    
            while (matchIter.hasNext()) {
                QRegularExpressionMatch match = matchIter.next();
                QString title = match.captured(1);
                QString content = match.captured(2).trimmed();
    
                // 根据标题映射到DataItems对应字段
                if (title == "Title1") {
                    item.title1Content = content;
                } else if (title == "Title2") {
                    // 数字类型可做转换
                    item.title2Content = content.toInt();
                } else if (title == "Title3") {
                    item.title3Content = content;
                }
                // 可扩展更多标题的字段映射
            }
    
            // 将解析完成的结构体添加到模型
            model->addDataToTable(dataItem);
        }
    
        file.close();
        return true;
    }
    
  • 边界情况处理

    • 跳过空行,避免无效数据进入模型
    • 对格式不规范的行(如缺少某个Title),可添加默认值填充或日志提示
    • 若内容中可能出现TitleX:字符串,可将正则中的Title\d+替换为固定标题列表(如(Title1|Title2|Title3)),避免误匹配

内容的提问来源于stack exchange,提问作者taathy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:55:22