QToolBox先removeItem再addItem失败

2023-12-31 05:16:46

问题

QoolBox additem失败

现象

请添加图片描述

在这里插入图片描述
在这里插入图片描述

解决代码

  • 在代码中,当尝试在 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++;
	}
}

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