diff -r f472f9773782 -r 7316a419334d src/ImportXML.cpp --- a/src/ImportXML.cpp Sat Jun 11 12:59:49 2022 +0200 +++ b/src/ImportXML.cpp Sat Jun 11 19:29:20 2022 +0200 @@ -16,6 +16,7 @@ */ #include "ImportXML.h" #include "../ui/ui_ImportXML.h" +#include "global.h" #include "MainWindow.h" @@ -47,10 +48,8 @@ { QSqlQuery query; QString sql, log; - int eq_total = 0, eq_errors = 0, f_total = 0, f_errors = 0, h_total = 0, h_errors = 0; - int m_total = 0, m_errors = 0, y_total = 0, y_errors = 0, rec_total = 0, rec_errors = 0; - int st_total = 0, st_errors = 0, mash_total = 0, mash_errors = 0, w_total = 0, w_errors = 0; int total = 0, errors = 0; + bool hasnotes; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath() + "/*.xml", tr("Files (*.xml)")); if (fileName == 0) { @@ -74,7 +73,7 @@ break; if (xml->tokenType() == QXmlStreamReader::StartDocument) { -// qDebug() << xml->readElementText(); + qDebug() << xml->documentVersion() << xml->documentEncoding(); // Just skip } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENTS")) { /* @@ -91,8 +90,8 @@ /* * Equipment */ - eq_total++; total++; + hasnotes = false; sql = "INSERT INTO inventory_equipments SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); sql.append("', top_up_water=0"); @@ -101,21 +100,30 @@ if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENT")) { + if (! hasnotes) + sql.append(", notes=''"); query.exec(sql); if (query.lastError().isValid()) { -// qWarning() << sql << query.lastError(); - eq_errors++; + qWarning() << sql << query.lastError(); errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } - if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { + if ((xml->tokenType() == QXmlStreamReader::StartElement) && + ((xml->name() == "VERSION") || (xml->name() == "DISPLAY_BOIL_SIZE") || + (xml->name() == "DISPLAY_BATCH_SIZE") || (xml->name() == "DISPLAY_TUN_VOLUME") || + (xml->name() == "DISPLAY_TUN_WEIGHT") || (xml->name() == "DISPLAY_TRUB_CHILLER_LOSS") || + (xml->name() == "DISPLAY_LAUTERDEADSPACE") || (xml->name() == "TUN_MATERIAL") || + (xml->name() == "ATTENUATION_FACTOR_YEAST") || (xml->name() == "ATTENUATION_FACTOR_WATER_TO_GRAIN_RATIO") || + (xml->name() == "ATTENUATION_FACTOR_TOTAL_MASH_TIME") || (xml->name() == "ATTENUATION_FACTOR_PERC_SIMPLE_SUGAR") || + (xml->name() == "ATTENUATION_FACTOR_CONSTANT"))) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { sql.append(QString(", name='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { sql.append(QString(", notes='%1'").arg(xml->readElementText())); + hasnotes = true; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_SIZE")) { sql.append(QString(", boil_size=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BATCH_SIZE")) { @@ -176,23 +184,52 @@ /* * Style */ - st_total++; + Style *st = new Style; + st->notes = st->category = st->style_letter = st->profile = st->ingredients = st->examples = ""; + st->style_guide = "BKG 2019"; + st->category_number = 0; total++; - sql = "INSERT INTO profile_styles SET uuid='"; - sql.append(QUuid::createUuid().toString().mid(1, 36)); - sql.append("'"); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLE")) { - query.exec(sql); + query.prepare("INSERT INTO profile_styles SET name=:name, category=:category, " + "category_number=:catnr, style_letter=:group, style_guide=:guide, type=:type, " + "og_min=:og_min, og_max=:og_max, fg_min=:fg_min, fg_max=:fg_max, ibu_min=:ibu_min, " + "ibu_max=:ibu_max, color_min=:ebc_min, color_max=:ebc_max, carb_min=:co2_min, " + "carb_max=:co2_max, abv_min=:abv_min, abv_max=:abv_max, notes=:notes, " + "profile=:profile, ingredients=:ingredients, examples=:examples, uuid=:uuid"); + query.bindValue(":name", st->name); + query.bindValue(":category", st->category); + query.bindValue(":catnr", st->category_number); + query.bindValue(":group", st->style_letter); + query.bindValue(":guide", st->style_guide); + query.bindValue(":type", st->type); + query.bindValue(":og_min", QString("%1").arg(st->og_min, 4, 'f', 3, '0')); + query.bindValue(":og_max", QString("%1").arg(st->og_max, 4, 'f', 3, '0')); + query.bindValue(":fg_min", QString("%1").arg(st->fg_min, 4, 'f', 3, '0')); + query.bindValue(":fg_max", QString("%1").arg(st->fg_max, 4, 'f', 3, '0')); + query.bindValue(":ibu_min", QString("%1").arg(st->ibu_min, 1, 'f', 0, '0')); + query.bindValue(":ibu_max", QString("%1").arg(st->ibu_max, 1, 'f', 0, '0')); + query.bindValue(":ebc_min", QString("%1").arg(st->color_min, 1, 'f', 0, '0')); + query.bindValue(":ebc_max", QString("%1").arg(st->color_max, 1, 'f', 0, '0')); + query.bindValue(":co2_min", QString("%1").arg(st->carb_min, 2, 'f', 1, '0')); + query.bindValue(":co2_max", QString("%1").arg(st->carb_max, 2, 'f', 1, '0')); + query.bindValue(":abv_min", QString("%1").arg(st->abv_min, 2, 'f', 1, '0')); + query.bindValue(":abv_max", QString("%1").arg(st->abv_max, 2, 'f', 1, '0')); + query.bindValue(":notes", st->notes); + query.bindValue(":profile", st->profile); + query.bindValue(":ingredients", st->ingredients); + query.bindValue(":examples", st->examples); + query.bindValue(":uuid", QUuid::createUuid().toString().mid(1, 36)); + query.exec(); if (query.lastError().isValid()) { - qWarning() << sql << query.lastError(); - st_errors++; + qWarning() << query.lastError(); errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); + delete st; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "VERSION")) || @@ -204,49 +241,61 @@ (xml->name() == "CARB_RANGE") || (xml->name() == "COLOR_RANGE") || (xml->name() == "ABV_RANGE")) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { - sql.append(QString(", name='%1'").arg(xml->readElementText())); + st->name = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY")) { - sql.append(QString(", category='%1'").arg(xml->readElementText())); + st->category = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY_NUMBER")) { - sql.append(QString(", category_number=%1").arg(xml->readElementText().toInt())); + st->category_number = xml->readElementText().toInt(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_LETTER")) { - sql.append(QString(", style_letter='%1'").arg(xml->readElementText())); + st->style_letter = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_GUIDE")) { - sql.append(QString(", style_guide='%1'").arg(xml->readElementText())); + st->style_guide = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { - sql.append(QString(", type=%1").arg(xml->readElementText().toInt())); + QString temp = xml->readElementText(); + if (temp == "Lager") + st->type = 0; + else if (temp == "Ale") + st->type = 1; + else if (temp == "Mead") + st->type = 2; + else if (temp == "Wheat") + st->type = 3; + else if (temp == "Mixed") + st->type = 4; + else if (temp == "Cider") + st->type = 5; } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { - sql.append(QString(", notes='%1'").arg(xml->readElementText())); + st->notes = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MIN")) { - sql.append(QString(", og_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); + st->og_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MAX")) { - sql.append(QString(", og_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); + st->og_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MIN")) { - sql.append(QString(", fg_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); + st->fg_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MAX")) { - sql.append(QString(", fg_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); + st->fg_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MIN")) { - sql.append(QString(", ibu_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->ibu_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MAX")) { - sql.append(QString(", ibu_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->ibu_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MIN")) { - sql.append(QString(", color_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->color_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MAX")) { - sql.append(QString(", color_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->color_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MIN")) { - sql.append(QString(", carb_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->carb_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MAX")) { - sql.append(QString(", carb_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->carb_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MIN")) { - sql.append(QString(", abv_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->abv_min = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MAX")) { - sql.append(QString(", abv_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); + st->abv_max = xml->readElementText().toDouble(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROFILE")) { - sql.append(QString(", profile='%1'").arg(xml->readElementText())); + st->profile = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "INGREDIENTS")) { - sql.append(QString(", ingredients='%1'").arg(xml->readElementText())); + st->ingredients = xml->readElementText(); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EXAMPLES")) { - sql.append(QString(", examples='%1'").arg(xml->readElementText())); + st->examples = xml->readElementText(); } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); @@ -255,6 +304,7 @@ } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLES")) { +qDebug() << "start FERMENTABLES"; /* * Fermentables */ @@ -269,26 +319,109 @@ /* * Fermentable */ - f_total++; total++; + hasnotes = false; sql = "INSERT INTO inventory_fermentables SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); + sql.append("'"); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLE")) { -// query.exec(sql); + qDebug() << "hasnotes" << hasnotes; + if (! hasnotes) + sql.append(", notes=''"); + query.exec(sql); if (query.lastError().isValid()) { -// qWarning() << sql << query.lastError(); - f_errors++; + qWarning() << sql << query.lastError(); errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } - if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { + if ((xml->tokenType() == QXmlStreamReader::StartElement) && + ((xml->name() == "VERSION") || (xml->name() == "DISPLAY_COST") || + (xml->name() == "DISPLAY_COLOR") || (xml->name() == "INVENTORY") || + (xml->name() == "PERCENTAGE") || (xml->name() == "ADJUST_TO_TOTAL_100") )) { // Ignore. + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { + sql.append(QString(", name='%1'").arg(xml->readElementText())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COST")) { + sql.append(QString(", cost=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { + QString temp = xml->readElementText(); + if (temp == "Grain") + sql.append(", type=0"); + else if (temp == "Sugar") + sql.append(", type=1"); + else if (temp == "Extract") + sql.append(", type=2"); + else if (temp == "Dry extract") + sql.append(", type=3"); + else if (temp == "Adjunct") + sql.append(", type=4"); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ORIGIN")) { + sql.append(QString(", origin='%1'").arg(xml->readElementText())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "SUPPLIER")) { + sql.append(QString(", supplier='%1'").arg(xml->readElementText())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { + sql.append(QString(", notes='%1'").arg(xml->readElementText())); + hasnotes = true; + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ALWAYS_ON_STOCK")) { + sql.append(QString(", always_on_stock=%1").arg(xml->readElementText().toLower())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YIELD")) { + sql.append(QString(", yield=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COARSE_FINE_DIFF")) { + sql.append(QString(", coarse_fine_diff=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MOISTURE")) { + sql.append(QString(", moisture=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DIASTATIC_POWER")) { + sql.append(QString(", diastatic_power=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MAX_IN_BATCH")) { + sql.append(QString(", max_in_batch=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECOMMEND_MASH")) { + sql.append(QString(", recommend_mash=%1").arg(xml->readElementText().toLower())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "GRAINTYPE")) { + QString temp = xml->readElementText(); + if (temp == "Base") + sql.append(QString(", graintype=0")); + else if (temp == "Roast") + sql.append(QString(", graintype=1")); + else if (temp == "Crystal") + sql.append(QString(", graintype=2")); + else if (temp == "Kilned") + sql.append(QString(", graintype=3")); + else if (temp == "Sour Malt") + sql.append(QString(", graintype=4")); + else if (temp == "Special") + sql.append(QString(", graintype=5")); + else if (temp == "No malt") + sql.append(QString(", graintype=6")); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADDED")) { + QString temp = xml->readElementText(); + if (temp == "Mash") + sql.append(QString(", added=0")); + else if (temp == "Boil") + sql.append(QString(", added=1")); + else if (temp == "Fermentation") + sql.append(QString(", added=2")); + else if (temp == "Lagering") + sql.append(QString(", added=3")); + else if (temp == "Bottle") + sql.append(QString(", added=4")); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ADD_AFTER_BOIL")) { + sql.append(QString(", add_after_boil=%1").arg(xml->readElementText().toLower())); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR")) { + sql.append(QString(", color=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROTEIN")) { + sql.append(QString(", protein=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DISSOLVED_PROTEIN")) { + sql.append(QString(", dissolved_protein=%1").arg(xml->readElementText().toDouble(), 5, 'f', 4, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "DI_pH")) { + sql.append(QString(", di_ph=%1").arg(xml->readElementText().toDouble(), 6, 'f', 5, '0')); + } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ACID_TO_pH_5.7")) { + sql.append(QString(", acid_to_ph_57=%1").arg(xml->readElementText().toDouble(), 6, 'f', 5, '0')); } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); @@ -311,7 +444,6 @@ /* * Hop */ - h_total++; total++; sql = "INSERT INTO inventory_hops SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -323,7 +455,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - h_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -353,7 +484,6 @@ /* * Misc */ - m_total++; total++; sql = "INSERT INTO inventory_miscs SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -365,7 +495,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - m_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -395,7 +524,6 @@ /* * Yeast */ - y_total++; total++; sql = "INSERT INTO inventory_yeasts SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -407,7 +535,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - y_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -437,7 +564,6 @@ /* * Water */ - w_total++; total++; sql = "INSERT INTO inventory_waters SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -449,7 +575,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - w_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -479,7 +604,6 @@ /* * Recipe */ - rec_total++; total++; sql = "INSERT INTO recipes SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -491,7 +615,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - rec_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -521,7 +644,6 @@ /* * Mash */ - mash_total++; total++; sql = "INSERT INTO inventory_mashs SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); @@ -533,7 +655,6 @@ // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); - mash_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); @@ -557,24 +678,12 @@ log.append(QString(" total errors\n")); log.append(QString(" ----- ------\n")); - log.append(QString("styles %1 %2\n").arg(st_total, 3).arg(st_errors, 3)); - log.append(QString("equipments %1 %2\n").arg(eq_total, 3).arg(eq_errors, 3)); - log.append(QString("fermentables %1 %2\n").arg(f_total, 3).arg(f_errors, 3)); - log.append(QString("hops %1 %2\n").arg(h_total, 3).arg(h_errors, 3)); - log.append(QString("miscs %1 %2\n").arg(m_total, 3).arg(m_errors, 3)); - log.append(QString("yeasts %1 %2\n").arg(y_total, 3).arg(y_errors, 3)); - log.append(QString("waters %1 %2\n").arg(w_total, 3).arg(w_errors, 3)); - log.append(QString("mashes %1 %2\n").arg(mash_total, 3).arg(mash_errors, 3)); - log.append(QString("recipes %1 %2\n").arg(rec_total, 3).arg(rec_errors, 3)); - log.append(QString(" ----- ------\n")); log.append(QString("total %1 %2\n").arg(total, 3).arg(errors, 3)); ui->logEdit->setPlainText(log); ui->progressBar->setValue(100); if (xml->hasError()) { - qWarning() << "error" << xml->error(); - } else { - qDebug() << "all good" << eq_total << eq_errors; + qWarning() << "XML error" << xml->error() << xml->errorString(); } file.close(); }