removeItem
函数中删除完所有项后立即调用 addItem
函数时,递归调用的深度可能会很大。addItem
函数的调用推迟到了当前函数完成后。这样,在 removeItem
函数执行完毕、函数栈帧被释放之后,才会执行 addItem
函数。这样做的好处是,每次递归调用的深度不会超过函数栈的容量,避免了栈溢出。addItem
函数,而不会在递归调用过程中耗尽函数栈造成崩溃。总结起来,通过定时器的延迟可以避免函数栈溢出,因为它将
addItem
函数的调用推迟到当前函数执行完成后。这样,可以确保每次递归调用的深度不会超过函数栈的容量,避免了崩溃的问题。
#include "ToolBox.h"
#include <QTimer>
#pragma execution_character_set("utf-8")
namespace {
QList<QWidget *> g_page;
QList<QString> g_pageName = {"页001","页002", "页003", "页004"};
}
ToolBox::ToolBox(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
for (int index = 0; index < ui.toolBox->count(); ++index)
{
g_page.append(ui.toolBox->widget(index));
}
}
void ToolBox::on_btnDel_clicked()
{
removeAllItem(); // 删除所有page页
}
void ToolBox::on_btnAdd_clicked()
{
addAllItem(); // 添加所有page页
}
void ToolBox::on_btnDel2Add_clicked()
{
#if 1
// 崩溃
removeAllItem(); // 删除所有page页
addAllItem(); // 添加所有page页
#endif
#if 0
// 解决崩溃
removeAllItem(); // 删除所有page页
QTimer::singleShot(10, this, [=]() {
addAllItem(); // 添加所有page页
});
#endif
}
// 删除所有page页
void ToolBox::removeAllItem()
{
for (int index = ui.toolBox->count()-1; index >= 0; index--)
{
ui.toolBox->removeItem(index);
}
for (auto pW : g_page)
{
if (pW == nullptr) continue;
pW->setParent(nullptr);
}
}
// 添加所有page页
void ToolBox::addAllItem()
{
int index = 0;
for (auto pW: g_page)
{
if (pW == nullptr) continue;
ui.toolBox->addItem(pW, g_pageName.at(index));
index++;
}
}