Просмотр наименований топлива.
После обработки запросов на получение наименований, формируем таблицу для отображения информации пользователю.
Индикация процесс выполнения запросов к базам данных азс будет использоваться не только для просмотра, а также при экспорте в xlsx и при выполнении скриптов изменяющих наименования. Для для этого в конструктор класса диалога ViewFuelNameDialog добавим еще один параметр определяющий дальнейшие действия. Список действий определим в качестве перечисления.
tasklist.h
#ifndef TASKLIST_H #define TASKLIST_H enum taskList { //Список задач VIEW_NAME, //Просмотр наименований XLSX_EXPORT, //Экспорт в xlsx UPDATE_FUEL_NAME //Изменение наименований }; #endif // TASKLIST_H
Изменим обработчик сигнала accepted() buttonBoxView:
void FuelNameDialog::on_buttonBoxView_accepted() { //Определяем дальнейший алгоритм работы в зависимости от выбранного checkBox int currentTask = (ui->radioButtonReport->isChecked()) ? VIEW_NAME : XLSX_EXPORT; //Диалог для отображения результатов и прогресса получения данных с АЗС ViewFuelNameDialog *viewFnDlg = new ViewFuelNameDialog(&listTerminals,currentTask, this); viewFnDlg->exec(); }
В слоте slotGetStatusThread добавляем проверку на завершение операций получения наименований и в зависимости от типа задачи вызываем соответствующую функцию.
ui->progressBarGetFuel->setFormat("Обработано %v из %m. Ошибок "+QString::number(colError)); //Проверяем что произошло получение информации от всех АЗС указанных в списке //И в зависимости от типа задачи запускаем соответствующую функцию //Сортируем список азс определив статическую функцию compare std::sort(m_listFuelName.begin(), m_listFuelName.end(),compare); if(ui->progressBarGetFuel->value() == m_connectionsList.size()){ switch (m_currentTask) { case VIEW_NAME: showFuelName(); break; case XLSX_EXPORT: exportXlsx(); break; default: break; } }
Функция реализации отображения наименований
//Отображение наименований void ViewFuelNameDialog::showFuelName() { QSqlQuery q; ui->groupBoxProgress->hide(); ui->tableWidgetView->setColumnCount(4); ui->tableWidgetView->setHorizontalHeaderLabels(QStringList() <<"Резервуар"<<"Код"<<"Краткое"<<"Полное"); ui->tableWidgetView->verticalHeader()->hide(); int colAzs = m_listFuelName.size(); for(int i = 0; i<colAzs; ++i ){ //Добавляем строку с номером и адресом АЗС int row = ui->tableWidgetView->rowCount(); ui->tableWidgetView->insertRow(row); QTableWidgetItem *itemAZS = new QTableWidgetItem(QString::number(m_listFuelName.at(i).terminalID())+" "+m_listFuelName.at(i).azsName()); itemAZS->setTextAlignment(Qt::AlignHCenter); itemAZS->setBackground(QColor("#aaff7f")); //Объединяем ячейки ui->tableWidgetView->setSpan(row,0,1,4); ui->tableWidgetView->setItem(row,0,itemAZS); for(int j = 0; j<m_listFuelName.at(i).listFuels().size();++j){ //Заполняем строки наименованиями int rowName = ui->tableWidgetView->rowCount(); ui->tableWidgetView->insertRow(rowName); ui->tableWidgetView->setItem(rowName,0, new QTableWidgetItem(QString::number(m_listFuelName.at(i).listFuels().at(j).tankID()))); ui->tableWidgetView->item(rowName,0)->setTextAlignment(Qt::AlignCenter); ui->tableWidgetView->setItem(rowName,1, new QTableWidgetItem(QString::number(m_listFuelName.at(i).listFuels().at(j).fuelID()))); ui->tableWidgetView->item(rowName,1)->setTextAlignment(Qt::AlignCenter); ui->tableWidgetView->setItem(rowName,2, new QTableWidgetItem(m_listFuelName.at(i).listFuels().at(j).shortName())); ui->tableWidgetView->setItem(rowName,3, new QTableWidgetItem(m_listFuelName.at(i).listFuels().at(j).name())); ui->tableWidgetView->resizeColumnToContents(3); } } ui->tableWidgetView->verticalHeader()->setDefaultSectionSize(ui->tableWidgetView->verticalHeader()->minimumSectionSize()); ui->groupBoxView->show(); }
Экспорт результатов в XSLX файл.
Для экспорта результатов в xlsx файл будем использовать библиотеку QXlsx
https://qtexcel.github.io/QXlsx/
. я остановился на ней посмотрев примеры использования и доступную инструкцию для подключения к проекту. Скомпилировал примеры и достаточно быстро разобрался в простейшем использовании библиотеки.
Инструкция по подключению представлена здесь
https://qtexcel.github.io/QXlsx/HowToSetProject.html
.
Кратко она выглядит так:
Клонируем исходники с github
git clone https://github.com/j2doll/QXlsx.git
Копируем содержимое папки QXlsx (папка header, source и файлы QXlsx.pri, QXlsx.pro) в папку нашего проекта.
Добавляем в наш файл проекта (*.pro)
# QXlsx code for Application Qt project QXLSX_PARENTPATH=./ # current QXlsx path is . (. means curret directory) QXLSX_HEADERPATH=./header/ # current QXlsx header path is ./header/ QXLSX_SOURCEPATH=./source/ # current QXlsx source path is ./source/ include(./QXlsx.pri)
В файле в котором будем использовать библиотеку добавляем заголовочные файлы.
#include "xlsxdocument.h" #include "xlsxchartsheet.h" #include "xlsxcellrange.h" #include "xlsxchart.h" #include "xlsxrichstring.h" #include "xlsxworkbook.h" using namespace QXlsx;
Библиотека готова к использованию.
void ViewFuelNameDialog::exportXlsx() { Document xlsx; // Будущий документ Format format; // Формат обычных ячеек Format formatMerge; // Формат объединенной ячейки Format formatTitle; // Формат заголовка //Задаем параметры форматирования format.setHorizontalAlignment(Format::AlignHCenter); format.setVerticalAlignment(Format::AlignVCenter); format.setBorderStyle(Format::BorderThin); formatMerge.setPatternBackgroundColor(QColor("#aaff7f")); formatMerge.setHorizontalAlignment(Format::AlignHCenter); formatMerge.setVerticalAlignment(Format::AlignVCenter); formatMerge.setBorderStyle(Format::BorderThin); formatTitle.setHorizontalAlignment(Format::AlignHCenter); formatTitle.setVerticalAlignment(Format::AlignVCenter); formatTitle.setFontBold(true); formatTitle.setBorderStyle(Format::BorderThin); formatTitle.setPatternBackgroundColor(QColor("#A9BCF5")); //Необходимо отметить что нумерация строк и столбцов в xlsx документе начинается с 1 //Устанавливаем ширину столбцов xlsx.setColumnWidth(1,10); xlsx.setColumnWidth(4,30); int columnCount = headers.size(); int colAzs = m_listFuelName.size(); //Заполняем заголовки for(int i =0; i<columnCount; ++i){ xlsx.write(1,i+1, headers.at(i),formatTitle); } //Табличная часть int rowX=2; for(int i=0; i<colAzs; ++i){ xlsx.write(rowX,1, QString::number(m_listFuelName.at(i).terminalID())+" "+m_listFuelName.at(i).azsName()); CellRange cellRange = CellRange(rowX,1,rowX,columnCount); xlsx.mergeCells(cellRange, formatMerge); for(int j = 0; j<m_listFuelName.at(i).listFuels().size(); ++j) { rowX++; xlsx.write(rowX,1,m_listFuelName.at(i).listFuels().at(j).tankID(),format); xlsx.write(rowX,2,m_listFuelName.at(i).listFuels().at(j).fuelID(),format); xlsx.write(rowX,3,m_listFuelName.at(i).listFuels().at(j).shortName(),format); xlsx.write(rowX,4,m_listFuelName.at(i).listFuels().at(j).name(),format); } } QFile xlsxFile; //Создаем абсолютный путь к файлу xlsxFile.setFileName(QApplication::applicationDirPath()+"/"+"FuelName.xlsx"); xlsx.saveAs(xlsxFile.fileName()); // Сохраняем документ #ifdef Q_OS_WIN QDesktopServices::openUrl(QUrl("file:///"+xlsxFile.fileName(), QUrl::TolerantMode)); #else QDesktopServices::openUrl(QUrl("file://"+xlsxFile.fileName(), QUrl::TolerantMode)); #endif this->reject(); }
Получам файл FuelName.xlsx который открывается программой по умолчанию.
Архив проекта
.