1

我尝试使用我的程序 cpp 解析 XML 文件,并将其存储在 QList 中,但我不知道为什么当我执行代码时应用程序什么也不返回(有时它会单独关闭)

这是我的功能:

void mission::loadMission(QList < waypoint* > wpList , QString filename){

     QXmlStreamReader xmlReader;
      int i=0 ;
      QFile file(filename);

      if(file.open(QIODevice::ReadOnly)) {
      xmlReader.setDevice(&file);;
      xmlReader.readNext();
      xmlReader.readNext();
      bool ok = false ;

      //Reading from the file
      while (!xmlReader.isEndDocument())
      {
          if (xmlReader.isStartElement())
          {
              QString name = xmlReader.name().toString();
              if (name == "Number" )
              {
                  wpList[i]->setNum(xmlReader.readElementText().toInt(&ok,10));
              }

              else  if (name == "Longitude" )
              {
                  wpList[i]->setLong(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Latitude" )
              {
                  wpList[i]->setLat(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Altitude" )
              {
                  wpList[i]->setAlt(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Heading" )
              {
                  wpList[i]->setHdg(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Time" )
              {
                  wpList[i]->setTime(xmlReader.readElementText().toInt(&ok,10));
              }

              else  if (name == "Type" )
              {
                  wpList[i]->setType(xmlReader.readElementText().toInt(&ok,10));
              }

          }
          else if (xmlReader.isEndElement())
          {
              xmlReader.readNext();
              i++ ;
          }
      }
      if (xmlReader.hasError())
      {
          cout << "XML error: " << xmlReader.errorString().data() << std::endl;
      }

  }



}

这是我的 XML 文件的一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<Mission>
    <Number>2013_7_11_16_28</Number>
    <Waypoint>
        <Number>0</Number>
        <Longitude>1.26946</Longitude>
        <Latitude>43.5147</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
    <Waypoint>
        <Number>1</Number>
        <Longitude>1.56958</Longitude>
        <Latitude>43.4721</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
    <Waypoint>
        <Number>2</Number>
        <Longitude>1.64424</Longitude>
        <Latitude>43.655</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
  </Mission>
4

1 回答 1

1

我建议您继续使用常规 C++ 和 STL 工作/学习,然后在您更精通时继续使用 Qt。我注意到的一些事情是关于基本的 C++ 编程,实际上与 Qt 无关。

对于初学者,需要通过引用而不是按值传递。

 void mission::loadMission(QList<waypoint*> &wpList , QString filename){  
     // ...
 }

存储一个 QList 指针可能没什么好处。我也会有 QList < waypoint> &。然后使用 QList::push_back() 方法并填充列表,而不是试图猜测索引列表的位置。

          void mission::loadMission(QList<waypoint> &wpList , QString filename){  
              // ...
              QStringRef name = xmlReader.name();
              if (name == "Waypoint" )
              {
                  waypoint wp;
                  wpList.push_back(wp);
              }
              if (name == "Number" )
              {
                  wpList.back().setNum(xmlReader.readElementText().toInt(&ok,10));
              }

也没有必要从 QStringRef 制作 QString 的临时副本

          QStringRef name = xmlReader.name();
          if (name == "Number" )
          { // ...
          }
于 2013-07-12T18:14:59.547 回答