QItemSelectionModel:: selectedinindexes()导致崩溃



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

调试断言失败!
(…)
文件:f: dd vctools crt src crt_bld self_x86 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.
}

我有完全相同的问题,只是我使用选定的行而不是选定的索引。当QModelIndexList中的内部QList试图从堆中删除索引时,我将其缩小到函数退出。不知道如何修复它,但我在这里读了这个有趣的帖子,并提出了这个函数:

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参数是您想要索引的列。

我有同样的问题与QTreeView和访问selectedIndexes()selectionModel()中的任何东西。

它是固定当我使用正确的Qt库正确的/MD编译器开关。

修复崩溃:

  • /MDd编译你的代码,并与调试Qt libs链接(示例Qt5Cored.lib
  • /MD编译你的代码并链接到Qt libs版本(示例Qt5Core.lib)

我设法解决了这个问题,但现在我不明白为什么这样做,然而:(我写这篇文章作为一个答案,希望它能帮助有同样问题的人)

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

就像我说的,我不知道为什么这个工作,如果有人能解释这个给我,我会很高兴听到。我甚至不知道为什么Windows SDK被列为编译器。不是吧?

相关内容

  • 没有找到相关文章

最新更新