使用QItemSelectionModel :: selectedIndexes()崩溃

时间:2013-02-27 21:48:49

标签: c++ qt qt5

我一直在寻找解决这个问题的方法,我开始相信这可能是Qt函数本身的一个错误。 问题是,在调用QItemSelectionModel :: selectedIndexes()之后,当程序试图破坏此函数返回的QModelIndexList时,程序将崩溃。在崩溃之前,您将收到以下调试消息:

  

Debug Assertion失败!
  (...)
  文件:   F:\ DD \ vctools \ crt_bld \ self_x86 \ CRT \ SRC \ dbgheap.c
  行:1419
  表达:   _pFirstBlock == pHead
  (...)

以下是导致问题的最简单代码,因此您可以自行测试:

#include <QApplication>
#include <QStringList>
#include <QStringListModel>
#include <QItemSelectionModel>
#include <QModelIndex>
#include <QModelIndexList>
#include <QListView>
#include <QItemSelectionModel>

void doSomethingWithSelection(QItemSelectionModel* selectionmodel);

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList list;
    list.push_back("1");
    list.push_back("2");
    list.push_back("3");
    list.push_back("4");
    QStringListModel model(list);
    QListView view;
    view.setModel(&model);
    view.setSelectionMode(QAbstractItemView::ExtendedSelection);

    QItemSelectionModel *selectionmodel = view.selectionModel();
    QModelIndex first = model.index(0);
    QModelIndex last = model.index(2);
    QItemSelection selection(first, last);
    selectionmodel->select(selection,QItemSelectionModel::Select);

    doSomethingWithSelection(selectionmodel);

    view.show();
    return a.exec();
}

void doSomethingWithSelection(QItemSelectionModel* selectionmodel)
{
    QModelIndexList indexlist = selectionmodel->selectedIndexes();
    // this is what causes the error. I put this inside a function
    // so the error will happen when exiting the function,
    // when the program try to destroy the list nodes.
}

3 个答案:

答案 0 :(得分:1)

我有完全相同的问题,只是我使用选定的行而不是选定的索引。当QModelIndexList中的内部QList尝试从堆中删除索引时,我将其缩小到函数exit。不确定如何解决它,但我读了这篇有趣的帖子here并提出了这个功能:

QModelIndexList Class::getViewSelection(QAbstractItemView *view ,  int columnNumber) const
{
  QModelIndexList list;
  for (int row = 0; row < view->model()->rowCount(view->rootIndex()); ++row)
  {
    QModelIndex index = view->model()->index(row, columnNumber, view->rootIndex());

    if (view->selectionModel()->isSelected(index))
        list.push_back(index);
   }
  return list;
}

我写了这个函数来获取选定的行,所以column参数是你想要索引的列。

答案 1 :(得分:0)

我设法解决了这个问题,但是现在我并没有说明为什么会这样,但是:(我写这个作为答案,希望它可以帮助有同样问题的人)

在我的Qt项目中,我使用了一个带有 Microsoft Windows SDK for Windows 7(7.0.7600.16385.40715)(x86) 的工具包作为编译器。当我将编译器更改为 Microsoft Visual C ++编译器10.0(x86) 时,此代码正常工作。

正如我所说,我不知道为什么会这样,如果有人可以向我解释,我会很高兴听到。我甚至不知道为什么Windows SDK被列为编译器..它不是,是吗?

答案 2 :(得分:0)

我在使用QTreeView并访问selectedIndexes()selectionModel()中的任何内容时遇到了同样的问题。

当我在正确的/MD库中使用正确的Qt编译器开关时,已修复

要修复崩溃,请执行以下操作:

  • 使用/MDd编译代码,并使用调试Qt libs进行链接(示例Qt5Cored.lib
  • 使用/MD编译代码并链接到版本Qt libs(例如Qt5Core.lib