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

如何在Qt TreeView中对项名称进行不区分大小写的字母排序?

TreeView目录键不区分大小写排序实现方案

要实现不区分大小写的字母排序(比如让"auto-update"紧随"Audio"之后),核心是重写QAbstractItemModel::sort()虚函数,在排序逻辑中使用不区分大小写的字符串比较规则。以下是完整代码示例:

1. 修改RegistryItemModel类定义

添加sort()函数的重写声明,以及递归排序子节点的辅助函数:

class RegistryItemModel : public QAbstractItemModel
{
    Q_OBJECT;

public:
    RegistryItemModel(QWidget *parent=NULL);
    virtual ~RegistryItemModel();
    // 重写排序函数
    void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;

private:
    // 递归排序子节点的辅助方法
    void sortChildItems(RegistryItem* parentItem, Qt::SortOrder order);
    // 假设你的模型中有根节点成员变量
    RegistryItem* mRootItem;
};

2. 实现排序逻辑

在RegistryItemModel的cpp文件中实现sort()和辅助函数:

void RegistryItemModel::sort(int column, Qt::SortOrder order)
{
    // 仅针对名称列排序(此处假设是第0列,可根据实际调整)
    if (column != 0) return;

    beginResetModel(); // 通知视图数据即将更新
    sortChildItems(mRootItem, order);
    endResetModel(); // 通知视图数据已更新
}

void RegistryItemModel::sortChildItems(RegistryItem* parentItem, Qt::SortOrder order)
{
    if (!parentItem) return;

    // 获取当前父节点的子节点列表
    QList<RegistryItem*> childItems = parentItem->getChildItems();

    // 使用不区分大小写的规则排序子节点
    std::sort(childItems.begin(), childItems.end(), [order](RegistryItem* a, RegistryItem* b) {
        QString nameA = a->getItemName(); // 替换为你实际的节点名称获取方法
        QString nameB = b->getItemName();
        int compareRes = QString::compare(nameA, nameB, Qt::CaseInsensitive);
        
        return (order == Qt::AscendingOrder) ? (compareRes < 0) : (compareRes > 0);
    });

    // 更新父节点的子节点顺序
    parentItem->setChildItems(childItems);

    // 递归排序所有子节点的子项
    for (RegistryItem* child : childItems) {
        sortChildItems(child, order);
    }
}

3. 启用TreeView排序功能

在RegistryTreeView的构造函数中开启排序支持:

RegistryTreeView::RegistryTreeView(Registry &inRegistry, QWidget *inParent)
{
    mModel = new RegistryItemModel;
    mModel->setRegistry(&inRegistry);

    mTreeView = new QTreeView;
    mTreeView->setContextMenuPolicy(Qt::DefaultContextMenu);
    mTreeView->setModel(mModel);
    mTreeView->setItemDelegate(new RegistryItemDelegate(mModel));
    mTreeView->installEventFilter(new AutoSelectEventFilter(this));
    
    // 启用排序功能
    mTreeView->setSortingEnabled(true);
    // 默认按第0列升序排序
    mTreeView->sortByColumn(0, Qt::AscendingOrder);
    
    mainLayout->addWidget(mTreeView);
}

注意事项

  • 请根据你实际的RegistryItem类调整getChildItems()、setChildItems()、getItemName()这些方法名,确保能正确获取和设置节点数据。
  • 如果需要支持多列排序,可在sort()函数中根据column参数判断要排序的字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:35:20