我要解析一个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:xmlspypnppschemaaaa.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又没有初始化,导致删除一个野指针而出现的错误。
------解决思路----------------------
记得声明一个指针需要初始化, 释放或析构时记得指针判空处理哦