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

C++ Qt5用std::stack<QTreeWidgetItem*>解析文本导入QTreeWidget时addChild卡死

问题根因
  • 核心错误是栈的维护逻辑缺失:仅实现了层级上升时的压栈操作,没有处理层级持平/回退时的弹栈逻辑,导致栈顶指针指向的节点并非当前节点的实际父节点,严重时会出现节点循环嵌套,触发界面无限重绘卡顿。
  • 压栈时机错误:当前代码仅在层级上升时将新节点压栈,若同一层级的后续节点存在子节点,会因栈中没有对应层级的父节点导致父节点指向错误。
修复代码
std::stack<QTreeWidgetItem*> treeStack;

auto *treeWidget = new QTreeWidget();
// 加载前关闭更新避免频繁重绘卡顿
treeWidget->setUpdatesEnabled(false);

std::ifstream dataFile("data.txt");
std::string lineString;
std::string itemString;
int depth;
int previousDepth = 0;

while (std::getline(dataFile, lineString)) {
    // 跳过空行
    if (lineString.empty()) continue;
    
    depth = 0;
    for (char c : lineString) {
        if (c == ' ') {
            ++depth;
        } else {
            break;
        }
    }
    itemString = lineString.substr(depth);
    depth /= 2;

    auto *itemWidget = new QTreeWidgetItem();
    auto *checkbox = new QCheckBox(QString::fromStdString(itemString));
    auto *treeLayout = new QBoxLayout(QBoxLayout::LeftToRight);
    treeLayout->setContentsMargins(5, 0, 0, 0);
    treeLayout->addWidget(checkbox);
    treeLayout->addStretch();
    auto *widget = new QWidget();
    widget->setLayout(treeLayout);

    // 修复:层级回退/持平时先弹栈,直到栈的层级匹配当前父节点层级
    // 栈的大小对应当前父节点的层级,当前节点的父层级为depth-1
    while (treeStack.size() > depth) {
        treeStack.pop();
    }

    if (depth == 0 || treeStack.empty()) {
        treeWidget->addTopLevelItem(itemWidget);
    } else {
        QTreeWidgetItem *itemWidgetParent = treeStack.top();
        itemWidgetParent->addChild(itemWidget);
    }

    treeWidget->setItemWidget(itemWidget, 0, widget);
    
    // 修复:将当前节点压栈,作为后续子节点的潜在父节点
    treeStack.push(itemWidget);

    previousDepth = depth;
}

// 加载完成后恢复更新
treeWidget->setUpdatesEnabled(true);
额外说明
  • 修复逻辑核心是保证栈的大小始终和当前节点的层级对齐,每次处理新节点前先把栈中超过父层级的节点弹出,确保栈顶就是当前节点的父节点。
  • 新增加载前禁用界面更新的逻辑,避免节点数量较多时频繁重绘导致的卡顿。
  • 新增空行跳过逻辑,避免文本文件中的空行生成无效节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:27:02