打印时限制QStringList的长度

时间:2019-01-18 10:25:00

标签: c++ qt

在使用QStringList时,我想通过仅打印前五个字符串来限制消息的长度。

这是我的实现方式:

// QStringList missing is already filled with random strings
QString warning = "Missing: ";
// Limit the warning up to the fifth element
for ( int i = 0; i < missing.size(); ++i ) {
    if ( i <= 4 ) {
        warning += ", %1".arg( missing.at(i) );
    } else {
        warning += ", ...";
        break;
    }
}

有没有更有效的方法?

3 个答案:

答案 0 :(得分:1)

在hauron的指导下,我发现这可能是最有效的方法:

if ( !missing.empty() ) { 
  auto noOfPrintStr = 5;
  QString warning = tr( "Missing: %1" )
                    .arg( missing.mid( 0, noOfPrintStr-1 ).join( ", " ) );
  if ( missing.size() > noOfPrintStr )
    warning += ", ...";

  // print the warning
}

答案 1 :(得分:0)

写一个助手:

QString joinWithLimit(size_t lenLimit, const QStringList &strings, const QString &separator = ", ")
{
    QString result;
    result.reserve(lenLimit); // to reduce number of allocations
    result += strings.front();

    for (int i = 1; i < strings.size(); ++i)
    {
       const auto &s = strings[i];
       if (result.length() + separator.length() + s.length() > lenLimit) {
           return result;
       }
       result += separator;
       result += s;
    }
    return result;
}

如果需要性能,则不建议使用arg(它需要做额外的解析格式字符串的工作,并且您不控制分配)。

答案 2 :(得分:-1)

尝试使用QStringList::join(...)http://doc.qt.io/qt-5/qstringlist.html#join)。

由于您只想合并最多前5个元素,为避免复制列表,请使用迭代器,即:

QString foo(const QStringList& myList)
{
   auto iterBegin = myList.begin();
   auto iterEnd = iterBegin + std::min(myList.size(), 5);
   return QStringList{iterBegin, iterEnd}.join(", ");
}

...但是它不起作用,因为QStringList没有这样的构造函数。您必须将QStrings复制到新的QStringList中。理想情况下,副本应该很浅-缓冲区在两个不同的QStrings中的两个QStringLists之间共享,但是我不确定Qt是否以此方式(它可能会提供单独的缓冲区)仅当您尝试更改基础字符串时。)

无论哪种方式,一旦您将QStringList设为子列表,只需调用:

subList.join(", ");