C++ 是什么导致我在Qt中的第一次机会(堆栈溢出)异常?
我有一个QComboBox,它应该在CurrentTextChanged上更新。我创建了以下connect语句,以便QCOMBOX触发OnFilterComboxCurrentTextChanged插槽: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
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)
递归如下所示:
如果在执行操作时需要停止信号传播,请在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:)