【问题标题】:Splitting a QString by delimiter into multiple QStrings?通过分隔符将 QString 拆分为多个 QString?
【发布时间】:2020-07-18 13:40:18
【问题描述】:

我知道这是一个简单的问题,可以在 python 中轻松完成,但我就是不记得要查找的关键字。

我有一个QStringQString line = "id: John",我想用分隔符:分割它,并将它们存储在两个QString而不是QStringList

QString line = "id: John"
QStringList elements = line.split(':');

我想要这样的单行,所以我可以用有意义的名称而不是 elements[0]elements[1] 来引用它们。

QString title, name = line.split(":");

【问题讨论】:

  • 编写一个自己的函数来执行 QString::split() 并用structured binding返回两个值
  • @chehrlic 你能写一个实际的答案吗?我不确定如何合理地执行您的建议。
  • @hyde:你想让我写什么?该功能可以例如返回一个 std::pair 然后可以将这两个解包为“line”和“name”。参见例如here
  • @chehrlic 在 cmets 中回答是不好的形式(其他 SE 站点主动删除尝试回答的 cmets)。实际答案将包括问题中的代码,经过扩充和修改,以便回答问题。
  • @hyde:随意删除它——我不在乎。我没有回答这个问题,我只是提示了如何解决这个问题,op 还是应该自己思考。

标签: c++ qt split


【解决方案1】:

我不确定你说的是什么意思

我可以用有意义的名称而不是elements[0] 来引用它们,并且 elements[1]

因为无论如何,当你想退回一对QString时,你必须解包QStringList

你可能会写一个这样的函数

auto stringListSplitter(const QString& str)
{
    QStringList elements = str.split(':');
    return std::make_pair(elements[0], elements[1]);
} 

你可以把它当作

    QString line = "id: John";
    auto pair = stringListSplitter(line);

    QString title = pair.first;
    QString name = pair.second;

【讨论】:

  • elements[0]elements[1] 是检索 QStrings 的方法,如果我要在拆分后将它们存储到 QStringList 中,这是我不想要的。你的解决方案基本上是一样的。我正在寻找像 python 一样的单线解决方案。
【解决方案2】:

正如 chehrlic 的评论所暗示的,要获得一个不错的单行,您需要一个小辅助函数,它将 QStringList 转换为可以与 structured binding 一起使用的东西。您不能直接使用QStringList,因为结构化绑定发生在编译时,并且列表是可变大小的动态结构。整个机制需要 C++17,所以如果你使用 QMake 项目,你应该在你的 pro 文件中添加CONFIG += c++17

#include <QStringList>
#include <QDebug>
#include <utility> // for std::make_pair

auto getPair(const QStringList &strings) {
    // Since your strings seem to have extra whitespace, I added trimmed call.
    // The value method nicely returns default value if index is out of range.
    return std::make_pair(strings.value(0).trimmed(),
                          strings.value(1).trimmed());
}

void main() { 
    auto input = QStringLiteral("id: John");
    auto [title, name] = getPair(input.split(':'));
    qDebug() << input << "->" << title << name; return 0;
}

【讨论】:

  • 如果我想将 QString 拆分为两个以上的元素怎么办?
  • @reddy 使用std::make_tuple 而不是std::make_pair。你需要一个单独的函数(或者做一些模板魔法让编译器为你生成不同的函数),因为函数的返回类型必须在编译时固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
相关资源
最近更新 更多