我之前问过一个问题,就是自己定义一个类,然后我在在其他源文件里定义了一个函数如下
void ActionEditor::load()
{
QString filename=QFileDialog::getOpenFileName(this,"Load video labelme format",projPath,tr("XML file (*.xml)"));
if(!filename.isEmpty())
{
if(pActionLabeling->readActionLabelMeXML(filename)==false)
{
QMessageBox::warning(this,"Warning","Fail to load the video labelme xml file!");
return;
}
}
}
目标是读取XML文件里的内容存起来以便以后的其他操作……
readActionLabelMeXML(filename)这个函数是如下写的:
bool ActionLabeling::readActionLabelMeXML(const QString& filename)
{
// read XML into buffer
QDomDocument doc("mydocument");
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
return false;
if (!doc.setContent(&file)) {
file.close();
return false;
}
file.close();
// a_LayerActionList.clear(); //
这里是第一个问题……我在这个函数的头文件定义了QList<LayerAction> a_LayerActionList,编译可以通过,但是我用load()导入XML文件debug到这就出错了,弹出的是Unhandled exception at 0x0127741d in ActionLabelingTool.exe: 0xC0000005: Access violation reading location 0x0000001c,因为没解决我就先注视掉了,然后接着debug selectedLayerIndex=0;
a_curFrameIndex=0;
//
QDomElement root=doc.documentElement();
QDomNode n=root.firstChild();
a_numFrames=0;
while(!n.isNull())
{
QDomElement e=n.toElement();
// parse the element at the top level
if(e.tagName()=="folder")
// a_framePath=e.text();//
于是这里出了第二个问题……,值赋不进去,我想是不是太长了,<folder>C:/XXX/XXXX/XX/LayerAnnotionTest/Debug/sample/</folder>,报的错和上面一样……于是我又注释掉…… if(e.tagName()=="NumFrames")
a_numFrames=e.text().toInt();
if(e.tagName()=="currentFrame")
a_curFrameIndex=e.text().toInt();
// load all the image file names
if(e.tagName()=="fileList")
{
QDomNode filelist_n=e.firstChild();
while(!filelist_n.isNull())
{
QDomElement filelist_e=filelist_n.toElement();
if(filelist_e.tagName()=="fileName")
a_fileList.append(filelist_e.text());
filelist_n=filelist_n.nextSibling();
}
if(a_numFrames==0)
a_numFrames=a_fileList.size();
}
if(e.tagName()=="source") // so far does not parse source
{
}
if(e.tagName()=="object") // parse the layer object
{
QDomNode obj_n=e.firstChild();
LayerAction layerAction;
while(!obj_n.isNull())
{
QDomElement obj_e=obj_n.toElement();
if(obj_e.tagName()=="name")
layerAction.a_setLayerName(obj_e.text());
if(obj_e.tagName()=="deleted")
{
}
if(obj_e.tagName()=="verified")
{
}
if(obj_e.tagName()=="date")
{
}
if(obj_e.tagName()=="id")
{
}
if(obj_e.tagName()=="numFrames")
layerAction.a_create(obj_e.text().toInt());
if(obj_e.tagName()=="startFrame")
layerAction.a_setStartFrame(obj_e.text().toInt());
if(obj_e.tagName()=="endFrame")
layerAction.a_setEndFrame(obj_e.text().toInt());
if(obj_e.tagName()=="createdFrame")
layerAction.a_setCreatedFrame(obj_e.text().toInt());
if(obj_e.tagName()=="labels")
{
// load the labels
QDomNode label_n=obj_e.firstChild();
while(!label_n.isNull())
{
int frameIndex;
QDomElement label_e=label_n.toElement();
if(label_e.tagName()=="frame")
{
QDomNode frame_n=label_e.firstChild();
while(!frame_n.isNull())
{
QDomElement frame_e=frame_n.toElement();
if(frame_e.tagName()=="index")
frameIndex=frame_e.text().toInt();
if(frame_e.tagName()=="depth")
//layerAction.a_setDepth(frameIndex,frame_e.text().toDouble());//
上面赋值都正常,到这里又不行了……inline void a_setDepth(int frameIndex,double depth){a_DepthList[frameIndex]=depth;};好像根本赋不禁值,于是我改成layerAction.a_setDepth(0,3.34);还是没反应,我又改成layerAction.a_DepthList[0]=3.123;直接弹出我后面给的那个截图……然后下面凡是用QList定义的变量都是这样的问题,其他变量就能正常赋值…… if(frame_e.tagName()=="globalLabel")
layerAction.a_setGlobalLabel(frameIndex,frame_e.text().toInt());
if(frame_e.tagName()=="localLabel")
layerAction.a_setLocalLabel(frameIndex,frame_e.text().toInt());
if(frame_e.tagName()=="tracked")
layerAction.a_setTracked(frameIndex,frame_e.text().toInt());
if(frame_e.tagName()=="depthLabel")
layerAction.a_setDepthLabel(frameIndex,frame_e.text().toInt());
if(frame_e.tagName()=="polygon") // read the polygon
{
AContour contour;
QDomNode contour_n=frame_e.firstChild();
while(!contour_n.isNull())
{
QPointF point(0,0);
bool isLabeled=true;
QDomElement contour_e=contour_n.toElement();
// add one point
if(contour_e.tagName()=="pt")
{
QDomNode pt_n=contour_e.firstChild();
while(!pt_n.isNull())
{
QDomElement pt_e=pt_n.toElement();
if(pt_e.tagName()=="x")
point.setX(pt_e.text().toDouble());
if(pt_e.tagName()=="y")
point.setY(pt_e.text().toDouble());
if(pt_e.tagName()=="labeled")
isLabeled=pt_e.text().toInt();
pt_n=pt_n.nextSibling();
}
contour.a_addPoint(point,isLabeled);;
}
contour_n=contour_n.nextSibling();
}
layerAction.a_setContour(frameIndex,contour);
} // end of reading the polygon
frame_n=frame_n.nextSibling();
}
}// end of reading the frames
label_n=label_n.nextSibling();
}// end of reading the labels
}
obj_n=obj_n.nextSibling();
} // end of parsing all the element in one layer
//layerObject.extendDepth();
a_LayerActionList.append(layerAction);
} // end of looping over layers
// end parsing the element at the top level
n=n.nextSibling();
}
return true;
}
这是最后弹出那个截图


我定义的变量如下:
#ifndef _LayerAction_h
#define _LayerAction_h
#include <QObject>
#include <QPointF>
#include <QList>
#include <QRectF>
#include "XmlWriter.h"
#include "AContour.h"
//class LayerDepth;
class XmlWriter;
class AContour;
class LayerAction: public QObject
{
Q_OBJECT
// the member variables
private:
QList<bool> a_LabelList; // the flag of whether the point is manually labelled or compute generated
QList<double> a_DepthList; // the depth, as a variable of frame index
QString a_LayerName;
QList<bool> a_IsGlobalLabelList;
QList<bool> a_IsLocalLabelList;
QList<bool> a_IsTrackedList;
QList<bool> a_IsDepthLabeledList;
int a_NumFrames; // the total number of frames, accessed by numFrames();
int a_StartFrame;
int a_EndFrame; // the start and end frame index, range [0, numFrames()-1]. accessed by startFrame() and endFrame();
int a_CreatedFrame; // the index of the frame where the object is created;
QList<AContour> a_contour;
static int selectedPointIndex;
static QPointF a_OrgCursorPoint;
public:
// construction, desctrution, copy, and clear
LayerAction(void);
LayerAction(const LayerAction& layerAction);
~LayerAction(void);
LayerAction& operator=(const LayerAction& layerAction);
void copyData(const LayerAction& layerAction);
inline void a_setLayerName(const QString& name){a_LayerName=name;};
//void create(int numFrames,int frameIndex,const QPointF& point,int layer_index);
void a_setStartFrame(int startFrame){a_StartFrame=startFrame;};
void a_create(int numFrames){a_NumFrames=numFrames;};
//inline void a_setStartFrame(int startFrame){a_StartFrame=startFrame;};
inline void a_setEndFrame(int endFrame){a_EndFrame=endFrame;};
inline void a_setCreatedFrame(int createdFrame){a_CreatedFrame=createdFrame;};
inline void a_setDepth(int frameIndex,double depth){a_DepthList[frameIndex]=depth;};
inline void a_setGlobalLabel(int frameIndex,bool label){a_IsGlobalLabelList[frameIndex]=label;};
inline void a_setLocalLabel(int frameIndex,bool label){a_IsLocalLabelList[frameIndex]=label;};
inline void a_setTracked(int frameIndex,bool label){a_IsTrackedList[frameIndex]=label;};
inline void a_setDepthLabel(int frameIndex,bool label){a_IsDepthLabeledList[frameIndex]=label;};
inline void a_setContour(int frameIndex,const AContour& acontour){a_contour[frameIndex]=acontour;};
};
#endif
我发现问题都和QList有点关系,我也无人可问只有来这里了……才学QT和C++,希望谁能指点一下……