我之前问过一个问题,就是自己定义一个类,然后我在在其他源文件里定义了一个函数如下
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++,希望谁能指点一下……