在使用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;
}
}
有没有更有效的方法?
答案 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(", ");