Просмотр наименований топлива.
После обработки запросов на получение наименований, формируем таблицу для отображения информации пользователю.
Индикация процесс выполнения запросов к базам данных азс будет использоваться не только для просмотра, а также при экспорте в 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 который открывается программой по умолчанию.
Архив проекта
.