应用场景:在Qt中使用QListWidget或者QTreeWidget时,有时候需要从数据库中初始化一些数据,放到这些Widget里面。但是数据库里或者文件里的数据,名称可能有重复的,但是在可视化的过程中,是不能呈现两个一样的文件名。
示例:在数据库中有以下几个重名但ID不同的条目:
- 新建文件
- 新建文件
- 新建文件
当把它们放到QListWidget中时,我们希望显示的效果如下:
- 新建文件
- 新家文件(1)
- 新建文件(2)
怎么实现上面所说效果呢?代码如下:
/*
@baseName 基于重命名的文本
@nameList 需要初始化的名称列表
*/
QString MyTest::forbidSameName(QString baseName, QStringList nameList)
{
int _count = 1;
QString _baseName = baseName;
QString _addName = baseName;
QStringList _nameList = nameList;
QStringList _lplitList = _addName.split('('); //左括号
if (_lplitList.count() == 2)
{
_baseName = _lplitList.first();
QStringList _rList = _lplitList.last().split(')');
if (_rList.count() == 2)
{
if (isNumber(_rList.first()))
_count = _rList.first().toInt();
}
}
do
{
_addName = _baseName + "(" + QString::number(_count++) + ")";
} while (_nameList.contains(_addName));
return _addName;
}
其中,参数baseName对应示例中的“新建文件”,nameList对应示例中的3个新建文件名称集合。
isNumber算法参考博文:https://blog.csdn.net/qq_36391817/article/details/80708590
bool MyTest::isNumber(QString& qstrSrc)
{
QByteArray ba = qstrSrc.toLatin1();
const char* s = ba.data();
bool bret = true;
while (*s)
{
if (*s >= '0' && *s <= '9')
{
}
else
{
bret = false;
break;
}
s++;
}
return bret;
}