You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Qt中含字母+数字的字符串列表自然排序问题

解决Qt QListWidget带数字文本的自然排序问题

默认的sortItems()方法按字符串字典序排序,会导致"cat 1"后紧跟"cat 10"、"cat 2"排在后面的问题——这是因为字典序只逐个比较字符的ASCII值,'1'的ASCII比'2'小,所以"cat 10"会被判定为小于"cat 2"。

要实现符合人类阅读习惯的自然排序(先比较前缀字符串,前缀相同则按数字大小排序),可以给sortItems()传入自定义的排序函数:

步骤1:定义自然排序比较函数

bool naturalSort(const QListWidgetItem* item1, const QListWidgetItem* item2) {
    QString text1 = item1->text();
    QString text2 = item2->text();

    // 拆分文本为前缀(cat/mouse/bird等)和数字部分
    auto splitText = [](const QString& text) -> QPair<QString, int> {
        int splitPos = 0;
        // 定位第一个数字的位置
        while (splitPos < text.size() && !text[splitPos].isDigit()) {
            splitPos++;
        }
        // 提取前缀并去除首尾空格(兼容"cat1"和"cat 1"两种格式)
        QString prefix = text.left(splitPos).trimmed();
        // 提取数字部分,转成整数
        int number = text.mid(splitPos).toInt();
        return {prefix, number};
    };

    auto [prefix1, num1] = splitText(text1);
    auto [prefix2, num2] = splitText(text2);

    // 先按前缀字典序排序
    if (prefix1 != prefix2) {
        return prefix1 < prefix2;
    }
    // 前缀相同则按数字大小排序
    return num1 < num2;
}

步骤2:调用自定义排序

替换原来的sortItems()调用,传入上面的比较函数:

ui->creature_list->sortItems(naturalSort);

注意事项

  • 该函数假设所有item文本都符合「前缀字符串+数字」的格式,如果存在格式异常的文本(比如数字后还有非数字字符),toInt()会自动忽略后续字符取前面的数字,或者返回0(如果没有有效数字),可以根据实际需求调整拆分逻辑。
  • 如果需要支持反向排序,只需在比较函数的返回值里取反,或者调用sortItems(Qt::DescendingOrder)时配合调整比较逻辑。

内容的提问来源于stack exchange,提问作者Mathilde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:10:41