C++ 是什么导致我在Qt中的第一次机会(堆栈溢出)异常?

C++ 是什么导致我在Qt中的第一次机会(堆栈溢出)异常?,c++,qt,exception,stack-overflow,C++,Qt,Exception,Stack Overflow,我有一个QComboBox,它应该在CurrentTextChanged上更新。我创建了以下connect语句,以便QCOMBOX触发OnFilterComboxCurrentTextChanged插槽: connect(m_viewController->getFilterWindow()->getFilterComboBox(), &QComboBox::currentTextChanged, this, &MainController::onFilterComb

我有一个QComboBox,它应该在CurrentTextChanged上更新。我创建了以下connect语句,以便QCOMBOX触发OnFilterComboxCurrentTextChanged插槽:

connect(m_viewController->getFilterWindow()->getFilterComboBox(), &QComboBox::currentTextChanged, this, &MainController::onFilterComboBoxCurrentTextChanged);
clearandaddicomtagstoshowntagslistwidget导致以下错误。我怎样才能解决这个问题

void MainController::onFilterComboBoxCurrentTextChanged(QString filterName)
{
    m_viewController->clearAndAddFilterNamesToFilterComboBox(m_fileController->loadFilterNamesFromConfigFile());
}

QStringList FileController::loadFilterNamesFromConfigFile()
{
    QSettings settings(QDir::toNativeSeparators("C:\\HelloWorld\\Config\\Filter.cfg"), QSettings::IniFormat);
    QStringList filtersNames = settings.childGroups();
    return filtersNames;
}

    void ViewController::clearAndAddFilterNamesToFilterComboBox(QStringList filterNames)
{
    m_filterWindow.getFilterComboBox()->clear();
    m_filterWindow.getFilterComboBox()->addItems(filterNames);
}

QListWidget* FilterWindow::getShownTagsListWidget()
{
    return ui.shownTagsListWidget;
}
DoseView.exe中0x777EAFC0(ntdll.dll)处的首次机会异常: 0xC00000FD:堆栈溢出(参数:0x00000001、0x002C2FFC)

DoseView.exe中0x777EAFC0(ntdll.dll)处未处理的异常: 0xC00000FD:堆栈溢出(参数:0x00000001、0x002C2FFC)


递归如下所示:

  • 组合框中的文本更改
  • 您调用clear(它会导致文本更改)
  • 返回1-递归就绪

  • 如果在执行操作时需要停止信号传播,请在combobox对象上调用
    blockSignals
    。然而,我真的会重新思考你的应用程序逻辑。我经常使用Qt,不需要经常使用blockSignals。

    简单的解决方法是在更新组合框的项目之前阻止信号。大概是这样的:

    void MainController::onFilterComboBoxCurrentTextChanged(QString filterName) {
    combobox->blockSignals(true); 
    m_viewController->clearAndAddFilterNamesToFilterComboBox(m_fileController->loadFilterNamesFromConfigFile());
    combobox->blockSignals(false);
    }
    

    但是我相信你应该能够通过更好的代码设计来防止它

    我们需要查看
    clearAndAddFilterNamesToFilterComboBox
    方法。很可能是您导致函数内部发出
    currentTextChanged
    信号,从而导致插槽的递归调用,从而导致堆栈溢出。@Jaa-c抱歉,我在问题中粘贴了错误的函数:)。我已经更新了code@Jaa-我怎样才能解决这个问题?不幸的是,我不完全理解为什么它会导致递归调用->堆栈overflow@Engo发生这种情况的原因是,
    onfilterComboxCurrentTextChanged
    调用了
    ClearAndAddFilterNamesToFilterComboxCurrentTextChanged
    ,这会更改组合框中的文本,从而导致调用
    onfilterComboxCurrentTextChanged
    ,依此类推。为什么每次组合框更改时都要重新填充它?@molbdnilo感谢您的精彩解释!你说的“更好的设计”是对的。我已经重构了我的代码,我不需要任何blocksignals:)你关于“重新思考你的应用程序逻辑”的说法是对的。我已经重构了代码,不需要任何blocksignals:)