【发布时间】:2016-01-04 09:20:14
【问题描述】:
我有一个应该在 CurrentTextChanged 上更新的 QComboBox。我创建了以下连接语句,以便 QComboBox 触发 onFilterComboBoxCurrentTextChanged 插槽:
connect(m_viewController->getFilterWindow()->getFilterComboBox(), &QComboBox::currentTextChanged, this, &MainController::onFilterComboBoxCurrentTextChanged);
clearAndAddDICOMTagsToShownTagsListWidget 会导致以下错误。我该如何解决这个问题?
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)。
【问题讨论】:
-
我们需要查看
clearAndAddFilterNamesToFilterComboBox方法。最有可能的是,您导致在函数内部发出currentTextChanged信号,从而导致对插槽的递归调用,从而导致堆栈溢出。 -
@Jaa-c 抱歉,我在问题中粘贴了错误的函数:)。我已经更新了代码
-
@Jaa-c 我该如何解决这个问题?不幸的是,我不完全理解为什么它会导致递归调用 -> 堆栈溢出
-
@Engo 发生这种情况是因为
onFilterComboBoxCurrentTextChanged调用clearAndAddFilterNamesToFilterComboBox,这会更改组合框中的文本,从而导致调用onFilterComboBoxCurrentTextChanged,等等。为什么每次更改组合框时都要重新填充它? -
@molbdnilo 感谢您的精彩解释!
标签: c++ qt exception stack-overflow