当前位置: 代码迷 >> QT开发 >> 显示树形结构的时候setModel出错
  详细解决方案

显示树形结构的时候setModel出错

热度:252   发布时间:2016-04-25 03:03:42.0
展示树形结构的时候setModel出错
我要解析一个schema文件,将解析出来的element用树形结构展示出来。
这个是我的treeItem类
#include <QList>
#include <QVariant>
class TreeItem
{
public:
    TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
    ~TreeItem();
private:
    //元素信息
    //.....

    //父节点
    TreeItem *parentItem;
    //节点对应数据
    QList<QVariant> itemData;
    //子节点
    QList<TreeItem*> childItems;

public:
    TreeItem *child(int row);
    TreeItem *parent();
    int row() const;
    int childCount() const;
    int columnCount() const;
    void appendChild(TreeItem *child);
};

构造函数
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
    parentItem = parent;
    itemData = data;
}

treeModel类里面的创建根节点和添加子节点的函数
TreeItem * TreeModel::creatRoot()
{
    QList<QVariant> rootData;
    rootData << "element name";
    rootItem = new TreeItem(rootData);
    return rootItem;
}
void TreeModel::addChild( TreeItem *pInfor, TreeItem *parent)
{
      parent->appendChild(pInfor);
}

MainWindow里面设置显示model的代码
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTreeView *view;
    TreeModel model;

    //创建根节点
    TreeItem *pTreeRoot = model.creatRoot();

    ReadSchemaFile readfile;
    readfile.ReadFile("D:\\xmlspy\\pnpp\\schema\\aaa.xsd",pTreeRoot);

    view = new QTreeView(this);
    view->setModel(&model);
}

现在setModel的时候是没有问题,但是执行完这一句之后再按F5就出错了,提示
在线程0中停止,因为:Exception at 0x6605696d,code:0xc0000005:write access violation at 0x1,flags = 0x0(first chance)
看这提示好像是内存写入错误,但是我看例子中也是创建一个model的对象,setModel的时候传地址。我调试的时候这个model中也是有数据的,第一次使用QT实在不太清楚问题出在哪里了,希望对QT 比较熟悉的帮忙找找问题出在哪里。谢谢。
------解决思路----------------------
首先,你的model定义必须是new一个TreeModel 指针,否则你的代码还是会有类似的错误,
这是因为不是new出的对象,导致MainWindow构造函数完成后,model对象自动析构,而你的rootItem又没有初始化,导致删除一个野指针而出现的错误。
------解决思路----------------------
记得声明一个指针需要初始化, 释放或析构时记得指针判空处理哦
  相关解决方案