QTreeWidget 查找

2024-01-02 16:26:45

1、QTreeWidget 查找 已知所有父项的子项

在 QTreeWidget 中查找一个已知所有父项的子项,可以通过遍历树结构并匹配每一层的父项来实现。以下是一个实现此功能的示例函数:

#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStringList>
#include <QList>

QTreeWidgetItem* findItemWithKnownParents(QTreeWidget* treeWidget, const QStringList& parentLabels) {
    QTreeWidgetItem* currentItem = nullptr;

    // 逐层遍历父项
    for (const QString& label : parentLabels) 
	{
        int childrenCount = (currentItem == nullptr) ? treeWidget->topLevelItemCount() : currentItem->childCount();

        // 在当前层级搜索匹配的项
        bool found = false;
        for (int i = 0; i < childrenCount; ++i) 
		{
            QTreeWidgetItem* childItem = (currentItem == nullptr) ? treeWidget->topLevelItem(i) : currentItem->child(i);
            if (childItem->text(0) == label) 
			{
                // 找到匹配的项,继续搜索下一层
                currentItem = childItem;
                found = true;
                break;
            }
        }

        // 如果在当前层级没有找到匹配的项,返回 nullptr
        if (!found) {
            return nullptr;
        }
    }

    // 返回找到的子项
    return currentItem;
}

这个函数接受 QTreeWidget 指针和一个包含父项标签的 QStringList。它从 QTreeWidget 的顶级开始,并逐层向下搜索,每次都匹配当前层级的父项。如果在任何层级上找不到匹配的项,则函数返回 nullptr。
调用示例:

QTreeWidget* treeWidget; // 你的 QTreeWidget 实例
QStringList parentLabels; // 包含父项标签的列表,从根到叶顺序
parentLabels << "根父项" << "中间父项" << "目标子项";

QTreeWidgetItem* foundItem = findItemWithKnownParents(treeWidget, parentLabels);

if (foundItem) {
    // 找到目标项
} else {
    // 未找到目标项
}

2、QTreewidget 筛选满足条件的所有QTreeWidgetItem

在 Qt 的 QTreeWidget 控件中筛选满足特定条件的所有 QTreeWidgetItem 项可以通过递归遍历实现。以下是一个示例函数,用于筛选满足给定条件的所有项。这里使用一个 lambda 函数作为条件,使其更灵活和通用。

#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <functional>

void filterItems(QTreeWidgetItem* item, std::function<bool(QTreeWidgetItem*)> condition, QList<QTreeWidgetItem*>& result) {
    if (!item) {
        return;
    }

    // 检查当前项是否满足条件
    if (condition(item)) {
        result.append(item);
    }

    // 遍历所有子项
    for (int i = 0; i < item->childCount(); ++i) {
        filterItems(item->child(i), condition, result);
    }
}

void filterAllItems(QTreeWidget* treeWidget, std::function<bool(QTreeWidgetItem*)> condition, QList<QTreeWidgetItem*>& result) {
    for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) {
        filterItems(treeWidget->topLevelItem(i), condition, result);
    }
}

在这个例子中,filterItems 函数递归地遍历树中的每个节点。condition 是一个 lambda 函数,它定义了筛选条件。如果一个项满足这个条件,它就会被添加到结果列表 result 中。

调用示例:

QTreeWidget* treeWidget; // 假设这是你的树控件

// 定义筛选条件,例如,查找文本包含特定字符串的项
auto condition = [](QTreeWidgetItem* item) -> bool {
    return item->text(0).contains("特定字符串");
};

QList<QTreeWidgetItem*> result;
filterAllItems(treeWidget, condition, result);

// 此时,result 包含所有满足条件的项
这种方法,通过更改 lambda 函数 condition,可以灵活地定义不同的筛选条件。

3、QTreeWidgetItem 递归查找多个QStringlist 包含项目

如果你需要在 QTreeWidgetItem 中递归查找多个 QStringList 包含的项目,你可以创建一个函数来递归地遍历树的每个节点,并检查每个节点的文本是否包含 QStringList 中的任何一个字符串。

调用示例:

#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStringList>
#include <QList>

void findItemsWithTexts(QTreeWidgetItem* item, const QStringList& texts, QList<QTreeWidgetItem*>& foundItems) {
    if (!item) {
        return;
    }

    // 检查当前项的文本是否包含 QStringList 中的任何字符串
    for (const QString& text : texts) {
        if (item->text(0).contains(text)) {
            foundItems.append(item);
            break; // 找到匹配项后,不需要检查其它文本
        }
    }

    // 递归搜索子项
    for (int i = 0; i < item->childCount(); ++i) {
        findItemsWithTexts(item->child(i), texts, foundItems);
    }
}

void findAllItemsWithTexts(QTreeWidget* treeWidget, const QStringList& texts, QList<QTreeWidgetItem*>& foundItems) {
    for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) {
        findItemsWithTexts(treeWidget->topLevelItem(i), texts, foundItems);
    }
}

findItemsWithTexts 函数递归地遍历树中的每个节点。对于每个节点,它检查节点的文本(这里假设是第一列,即 item->text(0)) 是否包含 QStringList 中的任何一个字符串。如果找到匹配的文本,它将该节点添加到 foundItems 列表中。findAllItemsWithTexts 函数是一个辅助函数,它开始于 QTreeWidget 的顶级项,并对每个项及其子项进行递归搜索。
调用示例:

QTreeWidget* treeWidget; // 你的树控件
QStringList texts; // 包含要搜索的文本的 QStringList
texts << "文本1" << "文本2"; // 例子,添加你需要搜索的文本

QList<QTreeWidgetItem*> foundItems;
findAllItemsWithTexts(treeWidget, texts, foundItems);

// 此时,foundItems 包含所有文本匹配的项

文章来源:https://blog.csdn.net/qq_36939187/article/details/135340029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。