• 6338阅读
  • 2回复

关于Qlist问题…… [复制链接]

上一主题 下一主题
离线kaitokidscs
 
只看楼主 倒序阅读 楼主  发表于: 2010-04-22
我之前问过一个问题,就是自己定义一个类,然后我在在其他源文件里定义了一个函数如下
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++,希望谁能指点一下……
离线kaitokidscs
只看该作者 1楼 发表于: 2010-04-22
那图片挂了……
http:/
/hiphotos.ba
idu.com/happy_line/pic/item/9e
289f12905f631bdd5401ba.jpg
我没找到论坛那里可以传图片……

还有我要读的XML文件格式如下:
- <annotation>
  <version>1.00</version>
  <videoType>frames</videoType>
  <folder>C:/XXX/XXXX/XX/LayerAnnotionTest/Debug/sample/</folder>
  <NumFrames>30</NumFrames>
  <currentFrame>2</currentFrame>
- <fileList>
  <fileName>palma 001.jpg</fileName>
  <fileName>palma 002.jpg</fileName>
  <fileName>palma 003.jpg</fileName>
  <fileName>palma 004.jpg</fileName>
  <fileName>palma 005.jpg</fileName>
  <fileName>palma 006.jpg</fileName>
  <fileName>palma 007.jpg</fileName>
  <fileName>palma 008.jpg</fileName>
  <fileName>palma 009.jpg</fileName>
  <fileName>palma 010.jpg</fileName>
  <fileName>palma 011.jpg</fileName>
  <fileName>palma 012.jpg</fileName>
  <fileName>palma 013.jpg</fileName>
  <fileName>palma 014.jpg</fileName>
  <fileName>palma 015.jpg</fileName>
  <fileName>palma 016.jpg</fileName>
  <fileName>palma 017.jpg</fileName>
  <fileName>palma 018.jpg</fileName>
  <fileName>palma 019.jpg</fileName>
  <fileName>palma 020.jpg</fileName>
  <fileName>palma 021.jpg</fileName>
  <fileName>palma 022.jpg</fileName>
  <fileName>palma 023.jpg</fileName>
  <fileName>palma 024.jpg</fileName>
  <fileName>palma 025.jpg</fileName>
  <fileName>palma 026.jpg</fileName>
  <fileName>palma 027.jpg</fileName>
  <fileName>palma 028.jpg</fileName>
  <fileName>palma 029.jpg</fileName>
  <fileName>palma 030.jpg</fileName>
  </fileList>
- <source>
  <sourceImage>videos taken by Antonio Torrabla</sourceImage>
  <sourceAnnotation>Qt-based C++ video labeling tool</sourceAnnotation>
  </source>
- <object>
  <name>car</name>
  <deleted>0</deleted>
  <verified>0</verified>
  <date>22-四月-2010 13:51:48</date>
  <id>0</id>
  <username>anonymous</username>
  <numFrames>30</numFrames>
  <startFrame>0</startFrame>
  <endFrame>2</endFrame>
  <createdFrame>0</createdFrame>
- <labels>
- <frame>
  <index>0</index>
  <depth>0</depth>
  <globalLabel>1</globalLabel>
  <localLabel>1</localLabel>
  <tracked>1</tracked>
  <depthLabel>1</depthLabel>
  <isPolygon>1</isPolygon>
- <polygon>
- <pt>
  <x>147</x>
  <y>203</y>
  <labeled>1</labeled>
  </pt>
- <pt>
  <x>89</x>
  <y>232</y>
  <labeled>1</labeled>
  </pt>
- <pt>
  <x>108</x>
  <y>306</y>
  <labeled>1</labeled>
  </pt>
- <pt>
  <x>268</x>
  <y>311</y>
  <labeled>1</labeled>
  </pt>
- <pt>
  <x>269</x>
  <y>269</y>
  <labeled>1</labeled>
  </pt>
- <pt>
  <x>269</x>
  <y>268</y>
  <labeled>1</labeled>
  </pt>
  </polygon>
  </frame>
- <frame>
  <index>1</index>
  <depth>0</depth>
  <globalLabel>1</globalLabel>
  <localLabel>0</localLabel>
  <tracked>1</tracked>
  <depthLabel>0</depthLabel>
  <isPolygon>1</isPolygon>
- <polygon>
- <pt>
  <x>160.372</x>
  <y>202.053</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>102.39</x>
  <y>231.38</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>121.319</x>
  <y>305.02</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>281.188</x>
  <y>309.524</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>282.2</x>
  <y>267.383</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>282.243</x>
  <y>266.452</y>
  <labeled>0</labeled>
  </pt>
  </polygon>
  </frame>
- <frame>
  <index>2</index>
  <depth>0</depth>
  <globalLabel>1</globalLabel>
  <localLabel>0</localLabel>
  <tracked>1</tracked>
  <depthLabel>0</depthLabel>
  <isPolygon>1</isPolygon>
- <polygon>
- <pt>
  <x>172.068</x>
  <y>201.096</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>114.283</x>
  <y>230.717</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>133.381</x>
  <y>304.204</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>292.927</x>
  <y>308.147</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>293.749</x>
  <y>265.713</y>
  <labeled>0</labeled>
  </pt>
- <pt>
  <x>293.753</x>
  <y>264.812</y>
  <labeled>0</labeled>
  </pt>
  </polygon>
  </frame>
  </labels>
  </object>
  </annotation>

希望有人能帮忙看看……如果能看源码就更好了……感激不尽……
代码 代码.rar (99 K) 下载次数:0   代码 代码.rar (99 K) 下载次数:0   代码 代码.rar (99 K) 下载次数:0
离线tangxunmin

只看该作者 2楼 发表于: 2010-05-11
不知LZ解决了没
我也遇到这样的问题
定义了QList  存了几个指针进去
再对这个list访问时   就出现了这样的问题。
快速回复
限100 字节
 
上一个 下一个