程序崩溃与Qt QAbstractTableModel :: index

时间:2016-05-04 16:12:44

标签: c++ qt

我正在尝试在qt中实现自定义模型。

我已将QAbstractTableModel子类化为我自己的类。我重新实现了所需的方法,但没有重新实现索引方法(如docs所说)。 columnCount()始终返回4(有固定数量的列),rowCount返回已插入行的数量。

我的程序看起来像这样:

application.h

#include mymodel.h
class ContilasSimulator : public QApplication
{
public:
    Aplication(int argc, char *argv[]);
    void someFunction();
private:
    MyModel m_model;
    MainWindow m_window;
};

application.cpp

#include application.h
Application::Application(int argc, char *argv[]) : QApplication(argc,argv),
{
    m_window.setModel(&m_model);
}

void someFunction()
{
    //...
if (m_model.insertRows(0,2))
    {
        QModelIndex index = m_model.index(0,0); //this statement works fine
        index = m_model.index(1,0); // this statement also works fine
        index = m_model.index(0,5); //this statements return an invalid index (as expected)
        index = m_model.index(0,1); //the program crashes a few seconds after executing this line
        //other code...
}

程序在我尝试获取m_model.index(0,1)行之后才崩溃,但不会立即崩溃(即,接下来的几行将执行,但几秒钟之后程序崩溃)。当我使用我的调试器逐行进行时,程序将在probelm行之后的行上或几行之后崩溃,具体取决于我单步执行的速度。我收到此错误消息:

ASSERT failure in QList<T>::at: "index out of range", file C:\Qt\Qt5.5.1\5.5\mingw492_32\include/QtCore/qlist.h, line 510

当我请求索引(0,0)和(1,0)而不是(0,1)时,我无法弄清楚为什么程序工作正常。我也无法弄清楚为什么它不会马上失败而是需要几秒钟才能失败。我没有对线程做任何事情。

对于我可能遇到此问题或我可以采取的进一步调试步骤的任何帮助将不胜感激。

我正在使用Qt 5.5和Qt Creator 3.4.2使用mingw进行编译

1 个答案:

答案 0 :(得分:0)

您正在尝试访问无效索引...这是未指定的行为...如果参数是疯狂的,qabstractitemmodel的某些实现将返回无效索引。但它不能保证..

在这种情况下发生的情况是,表模型使用了引擎盖下的QList,并且不需要进行范围检查......这会导致超出范围的访问。即使Qt没有说出它是什么,我怀疑超出限制的访问是undefined behavior

无论如何这是错的。 仅访问有效索引。故事的结尾。