如何将特定格式文本文件数据加载至自定义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
相关产品推荐
相关产品推荐

