Я пытаюсь проанализировать XML-файл с моей программой cpp и сохранить его в 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>
Я бы порекомендовал вам продолжать работать / учиться с обычным C ++ & STL, а затем переходите к Qt, когда вы более опытны. Некоторые вещи, которые я заметил, касаются базового программирования на C ++ и на самом деле не имеют ничего общего с Qt.
Для начала нужно пройти по ссылке, а не по значению.
void mission::loadMission(QList<waypoint*> &wpList , QString filename){
// ...
}
Вероятно, мало что можно получить, храня QList указателей. Я бы тоже просто имел QList < путевая> &, Затем используйте метод 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));
}
Также нет необходимости делать временную копию QString из QStringRef
QStringRef name = xmlReader.name();
if (name == "Number" )
{ // ...
}
Других решений пока нет …