QToolBox先removeItem再addItem失败
2023-12-31 05:16:46
问题
现象
解决代码
- 在代码中,当尝试在
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!