打印时限制 QStringList 的长度

Limit the length of QStringList when printing

本文关键字:QStringList 打印      更新时间:2023-10-16

我想通过使用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;
    }
}

有没有更有效的方法可以做到这一点?

在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
}

编写一个帮助程序:

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(它需要做额外的解析格式字符串的工作,并且您不控制分配)。

尝试使用 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中。理想情况下,副本将是浅的 - 缓冲区在两个不同QStringLists的两个QStrings之间共享,但我不确定 Qt 是否这样做(它可能会,并且仅在您尝试更改底层字符串时才提供单独的缓冲区)。

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

subList.join(", ");