138 lines
4.2 KiB
C++
138 lines
4.2 KiB
C++
#include "tools.h"
|
|
|
|
int getLevel(QStandardItem *item) {
|
|
int level = 0;
|
|
QStandardItem *parent = item->parent();
|
|
if(parent)
|
|
{
|
|
while (parent) {
|
|
level++;
|
|
parent = parent->parent();
|
|
}
|
|
return level;
|
|
}
|
|
else{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
QStandardItem* findStandardItemAtLevel(QStandardItemModel *model, int targetLevel,
|
|
const QString &targetText,
|
|
QStandardItem *parent,
|
|
int currentLevel) {
|
|
if (!model) return nullptr;
|
|
|
|
if (currentLevel == targetLevel) {
|
|
if (parent) {
|
|
// 在父项的子树中查找
|
|
for (int row = 0; row < parent->rowCount(); ++row) {
|
|
QStandardItem *item = parent->child(row, 0);
|
|
if (item && item->text() == targetText) {
|
|
return item;
|
|
}
|
|
}
|
|
} else {
|
|
// 在根层级查找
|
|
for (int row = 0; row < model->rowCount(); ++row) {
|
|
QStandardItem *item = model->item(row, 0);
|
|
if (item && item->text() == targetText) {
|
|
return item;
|
|
}
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
if (currentLevel > targetLevel) return nullptr;
|
|
|
|
// 递归查找子项
|
|
if (parent) {
|
|
for (int row = 0; row < parent->rowCount(); ++row) {
|
|
QStandardItem *child = parent->child(row, 0);
|
|
QStandardItem *result = findStandardItemAtLevel(model, targetLevel, targetText, child, currentLevel + 1);
|
|
if (result) return result;
|
|
}
|
|
} else {
|
|
for (int row = 0; row < model->rowCount(); ++row) {
|
|
QStandardItem *item = model->item(row, 0);
|
|
QStandardItem *result = findStandardItemAtLevel(model, targetLevel, targetText, item, currentLevel + 1);
|
|
if (result) return result;
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
QList<QStandardItem*> getAllChildren(QStandardItem* parentItem) {
|
|
QList<QStandardItem*> children;
|
|
|
|
if (!parentItem) return children;
|
|
|
|
for (int row = 0; row < parentItem->rowCount(); ++row) {
|
|
for (int column = 0; column < parentItem->columnCount(); ++column) {
|
|
QStandardItem* childItem = parentItem->child(row, column);
|
|
if (childItem) {
|
|
children.append(childItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
return children;
|
|
}
|
|
|
|
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
|
|
int role, const QModelIndex& parent) {
|
|
for (int row = 0; row < model->rowCount(parent); ++row) {
|
|
QModelIndex idx = model->index(row, 0, parent); // 假设查找第0列
|
|
if (model->data(idx, role) == target) {
|
|
return idx; // 找到匹配项
|
|
}
|
|
// 递归查找子项
|
|
if (model->hasChildren(idx)) {
|
|
QModelIndex childIdx = findIndex(model, target, role, idx);
|
|
if (childIdx.isValid()) {
|
|
return childIdx;
|
|
}
|
|
}
|
|
}
|
|
return QModelIndex(); // 未找到
|
|
}
|
|
|
|
QStandardItem* deepCloneItem(const QStandardItem* source) {
|
|
if (!source) return nullptr;
|
|
|
|
// 使用 clone() 方法创建副本
|
|
QStandardItem* clone = source->clone();
|
|
|
|
// 递归复制所有子项
|
|
for (int row = 0; row < source->rowCount(); ++row) {
|
|
for (int col = 0; col < source->columnCount(); ++col) {
|
|
if (QStandardItem* child = source->child(row, col)) {
|
|
clone->setChild(row, col, deepCloneItem(child));
|
|
}
|
|
}
|
|
}
|
|
|
|
return clone;
|
|
}
|
|
|
|
QStandardItemModel* deepCloneModel(const QStandardItemModel* source) {
|
|
if (source == nullptr) return nullptr;
|
|
|
|
// 设置相同的行列数
|
|
QStandardItemModel* dest = new QStandardItemModel(source->parent());
|
|
|
|
dest->setRowCount(source->rowCount());
|
|
dest->setColumnCount(source->columnCount());
|
|
|
|
// 复制所有数据项
|
|
for (int row = 0; row < source->rowCount(); ++row) {
|
|
for (int col = 0; col < source->columnCount(); ++col) {
|
|
if (QStandardItem* item = source->item(row, col)) {
|
|
dest->setItem(row, col, deepCloneItem(item));
|
|
}
|
|
}
|
|
}
|
|
return dest;
|
|
}
|