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

时间:2016-01-04 09:20:14

标签: c++ qt exception stack-overflow

我有一个QComboBox,应该在CurrentTextChanged上更新。我创建了以下连接语句,以便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)。

enter image description here

2 个答案:

答案 0 :(得分:2)

递归看起来像这样:

  1. 组合框中的文字更改
  2. 您呼叫清除(导致文本更改)
  3. 回到1 - 准备递归。
  4. 如果在组合框对象上执行操作调用blockSignals时需要停止信号传播。但是,我真的会重新考虑你的app逻辑。我经常使用Qt,并且不需要经常使用blockSignals。

答案 1 :(得分:1)

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

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

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