Ruslan Polupan
Там. 2, 2019, 3:28 Т.Қ.

iMpos жобасы. Бөлім 009. Жанармай атауларының өзгеруі. Терминалды таңдау

Диалог изменения наименований топлива.

Внешний вид диалога.

Диалог полностью создавался в Qt Designer.


В главное меню добавляем раздел Утилиты с пунктом Наименования топлива , также добавляем соответствующую кнопку на панель инструментов.
Слот вызова диалога в mainwindow.cpp

  1. void MainWindow::on_actionFuelName_triggered()
  2. {
  3. FuelNameDialog *fuelDlg = new FuelNameDialog();
  4. //Устанавливаем диалог центральным виджетом гланого окна
  5. this->setCentralWidget(fuelDlg);
  6. this->setWindowTitle(this->windowTitle()+" - "+fuelDlg->windowTitle());
  7. fuelDlg->exec();
  8. }

Первый шагом необходимо реализовать возможность выбора пользователем терминалов (АЗС), на которых будет производится изменение наименований топлива.
Для реализации взаимодействия используем кнопки добавления терминалов в нижней части диалога. Первая кнопка добавляет один терминал, вторая позволяет выбрать терминалы определенного региона и третья выбрать регион целиком.
Кнопки в верхней части GroupBox позволяют выбрать все терминалы в табличной части или снять выделения со всех терминалов. Также реализована кнопка удаления всех выбранных терминалов из табличной части.

Реализация диалога

fuelname.h

  1. #ifndef FUELNAMEDIALOG_H
  2. #define FUELNAMEDIALOG_H
  3.  
  4. #include <QDialog>
  5. #include <QGroupBox>
  6. #include <QSqlQuery>
  7. #include <QSqlError>
  8.  
  9. namespace Ui {
  10. class FuelNameDialog;
  11. }
  12.  
  13.  
  14. class FuelNameDialog : public QDialog
  15. {
  16. Q_OBJECT
  17.  
  18. public:
  19. explicit FuelNameDialog(QWidget *parent = nullptr);
  20. ~FuelNameDialog();
  21.  
  22. private slots:
  23. void on_toolButtonSelectTerminal_clicked();
  24. void on_pushButtonSelectAll_clicked();
  25. void on_pushButtonDeSelectAll_clicked();
  26. void on_pushButtonDeleteSelected_clicked();
  27. void on_toolButtonSelectTermRegions_clicked();
  28. void on_toolButtonSelectRegion_clicked();
  29. private:
  30. void createUI(); //Создание начального интерфейса
  31. void fillingTerminals(int terminalID); //Зполнение TableWidget выбранным терминалом
  32. void fillingTerminals(QList<int> listTerm); //Зполнение TableWidget выбранными терминалами
  33. private:
  34. Ui::FuelNameDialog *ui;
  35. };
  36.  
  37. #endif // FUELNAMEDIALOG_H

fuelname.cpp

  1. #include "fuelnamedialog.h"
  2. #include "ui_fuelnamedialog.h"
  3. #include "addterminaldialog.h"
  4. #include "addregionterminalsdialog.h"
  5. #include "addregionsdialog.h"
  6. #include "LoggingCategories/loggingcategories.h"
  7. #include <QGroupBox>
  8. #include <QDate>
  9.  
  10. FuelNameDialog::FuelNameDialog(QWidget *parent) :
  11. QDialog(parent),
  12. ui(new Ui::FuelNameDialog)
  13. {
  14. ui->setupUi(this);
  15.  
  16. createUI();
  17.  
  18. }
  19.  
  20. FuelNameDialog::~FuelNameDialog()
  21. {
  22. delete ui;
  23. }
  24.  
  25. void FuelNameDialog::createUI()
  26. {
  27. //Раскрашиваем кнопки QDialogButtonBox
  28. ui->buttonBox->button(QDialogButtonBox::Apply)->setStyleSheet("background: #00FF80");
  29. ui->buttonBox->button(QDialogButtonBox::Cancel)->setStyleSheet("background: #FA5858");
  30. ui->buttonBox->button(QDialogButtonBox::Reset)->setStyleSheet("background: #A9BCF5");
  31.  
  32. //Деактивируем кнопки управления пока нет добавленных терминалов
  33. ui->pushButtonSelectAll->setEnabled(false);
  34. ui->pushButtonDeSelectAll->setEnabled(false);
  35. ui->pushButtonDeleteSelected->setEnabled(false);
  36.  
  37. //Устанавливаем текущую дату и запрещаем выделять дату меньше текущей
  38. ui->dateEdit->setDate(QDate::currentDate());
  39. ui->dateEdit->setMinimumDate(QDate::currentDate());
  40.  
  41. //Настраиваем внешний вид TableWidget
  42. ui->tableWidgetTerm->setColumnCount(3);
  43. ui->tableWidgetTerm->setHorizontalHeaderLabels(QStringList() << "" << "АЗС" << "Наименование");
  44. ui->tableWidgetTerm->verticalHeader()->hide();
  45. ui->tableWidgetTerm->resizeColumnsToContents();
  46. ui->tableWidgetTerm->horizontalHeader()->setStretchLastSection(true);
  47. }
  48. //Добавление информации о выбранном терминале
  49. void FuelNameDialog::fillingTerminals(int terminalID)
  50. {
  51. ui->pushButtonSelectAll->setEnabled(true);
  52. ui->pushButtonDeSelectAll->setEnabled(true);
  53. ui->pushButtonDeleteSelected->setEnabled(true);
  54.  
  55. int row = ui->tableWidgetTerm->rowCount();
  56. //Если терминал есть в списке его не добавляем.
  57. for (int i = 0; i<row; ++i) {
  58. if( terminalID == ui->tableWidgetTerm->item(i,1)->data(Qt::DisplayRole).toInt())
  59. return;
  60. }
  61.  
  62. ui->tableWidgetTerm->insertRow(row);
  63. //В столбце 0 добавляем CheckBox
  64. QWidget *checkBoxWidget = new QWidget();
  65. QCheckBox *checkBox = new QCheckBox();
  66. QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
  67. layoutCheckBox->addWidget(checkBox);
  68. layoutCheckBox->setAlignment(Qt::AlignCenter);
  69. layoutCheckBox->setContentsMargins(0,0,0,0);
  70. checkBox->setChecked(true);
  71. ui->tableWidgetTerm->setCellWidget(row,0,checkBoxWidget);
  72. //Получаем данные о терминале из базы данных и добавляем их в TableWidget
  73. QSqlQuery q;
  74. q.prepare("select TRIM(t.NAME) from TERMINALS t where t.TERMINAL_ID=:terminalID");
  75. q.bindValue(":terminalID", terminalID);
  76. if(!q.exec()) qCritical(logCritical()) << "Не возможно получит данные по терминалу" << terminalID << q.lastError().text();
  77. q.next();
  78. ui->tableWidgetTerm->setItem(row,1, new QTableWidgetItem(QString::number(terminalID)));
  79. ui->tableWidgetTerm->setItem(row,2,new QTableWidgetItem(q.value(0).toString()));
  80. ui->tableWidgetTerm->sortByColumn(1,Qt::AscendingOrder);
  81.  
  82. ui->tableWidgetTerm->resizeColumnsToContents();
  83. ui->tableWidgetTerm->horizontalHeader()->setStretchLastSection(true);
  84. ui->tableWidgetTerm->verticalHeader()->setDefaultSectionSize(ui->tableWidgetTerm->verticalHeader()->minimumSectionSize());
  85.  
  86. }
  87. //Добавление информации о выбранном списке терминалов
  88. void FuelNameDialog::fillingTerminals(QList<int> listTerm)
  89. {
  90. foreach(int terminalID, listTerm){
  91. fillingTerminals(terminalID);
  92. }
  93. }
  94. //Вызываем диалог добавления одного терминала
  95. void FuelNameDialog::on_toolButtonSelectTerminal_clicked()
  96. {
  97. AddTerminalDialog *addTermDlg = new AddTerminalDialog(this);
  98.  
  99. addTermDlg->move(this->parentWidget()->geometry().center().x() - addTermDlg->geometry().center().x(),
  100. this->parentWidget()->geometry().center().y() - addTermDlg->geometry().center().y());
  101. if(addTermDlg->exec() == QDialog::Accepted){
  102. fillingTerminals(addTermDlg->getTerminals());
  103. }
  104.  
  105. }
  106. //Вызываем диалог добавления терминалов региона
  107. void FuelNameDialog::on_toolButtonSelectTermRegions_clicked()
  108. {
  109. AddRegionTerminalsDialog *addRegTermDlg = new AddRegionTerminalsDialog(this);
  110.  
  111. addRegTermDlg->move(this->parentWidget()->geometry().center().x() - addRegTermDlg->geometry().center().x(),
  112. this->parentWidget()->geometry().center().y() - addRegTermDlg->geometry().center().y());
  113. if(addRegTermDlg->exec() == QDialog::Accepted){
  114. fillingTerminals(addRegTermDlg->getTerminalsLists());
  115. }
  116.  
  117. }
  118. //Вызываем диалог добавления региона
  119. void FuelNameDialog::on_toolButtonSelectRegion_clicked()
  120. {
  121. AddRegionsDialog *addRegDlg = new AddRegionsDialog(this);
  122.  
  123. addRegDlg->move(this->parentWidget()->geometry().center().x() - addRegDlg->geometry().center().x(),
  124. this->parentWidget()->geometry().center().y() - addRegDlg->geometry().center().y());
  125. if(addRegDlg->exec() == QDialog::Accepted){
  126. fillingTerminals(addRegDlg->getTerminalsLists());
  127. }
  128. }
  129. //Устанавливаем выбор на всех CheckBox в таблице
  130. void FuelNameDialog::on_pushButtonSelectAll_clicked()
  131. {
  132. const int rowCount = ui->tableWidgetTerm->rowCount();
  133. for(int i = 0; i < rowCount; ++i){
  134. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  135. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  136. checkBox->setChecked(true);
  137. }
  138. }
  139. //Удаляем выбор на на всех CheckBox в таблице
  140. void FuelNameDialog::on_pushButtonDeSelectAll_clicked()
  141. {
  142. const int rowCount = ui->tableWidgetTerm->rowCount();
  143. for(int i = 0; i < rowCount; ++i){
  144. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  145. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  146. checkBox->setChecked(false);
  147. }
  148. }
  149. //Удаление выбранных терминалов из TableWidget
  150. void FuelNameDialog::on_pushButtonDeleteSelected_clicked()
  151. {
  152. int rowCount = ui->tableWidgetTerm->rowCount();
  153. int uncheckCount=0; //Колличество не выбранных строк
  154. for(int i =0; i<rowCount; i++){
  155. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  156. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  157. if(!checkBox->isChecked()){
  158. uncheckCount++;
  159. }
  160. }
  161. int currentRow = 0;
  162. //Перебираем строки таблицы и если CheckBox выбран удалянм строку
  163. //если не выбран переходим на следующую строку
  164. while(rowCount != uncheckCount){
  165. QWidget *item = ui->tableWidgetTerm->cellWidget(currentRow,0);
  166. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  167. if(checkBox->isChecked()){
  168. ui->tableWidgetTerm->removeRow(currentRow);
  169. rowCount = ui->tableWidgetTerm->rowCount();
  170. } else {
  171. currentRow++;
  172. }
  173. }
  174. if(rowCount == 0){
  175. ui->pushButtonSelectAll->setEnabled(false);
  176. ui->pushButtonDeSelectAll->setEnabled(false);
  177. ui->pushButtonDeleteSelected->setEnabled(false);
  178. }
  179. }

Реализация диалога выбора терминала определенного региона

addregionterminalsdialog.h

  1. #ifndef ADDREGIONTERMINALSDIALOG_H
  2. #define ADDREGIONTERMINALSDIALOG_H
  3.  
  4. #include <QDialog>
  5. #include <QSqlQueryModel>
  6. #include <QSqlQuery>
  7. #include <QSqlError>
  8. namespace Ui {
  9. class AddRegionTerminalsDialog;
  10. }
  11.  
  12. class AddRegionTerminalsDialog : public QDialog
  13. {
  14. Q_OBJECT
  15.  
  16. public:
  17. explicit AddRegionTerminalsDialog(QWidget *parent = nullptr);
  18. ~AddRegionTerminalsDialog();
  19. QList<int> getTerminalsLists();
  20.  
  21. private slots:
  22. void on_comboBoxRegions_activated(int idx);
  23. void on_pushButtonSelectAll_clicked();
  24. void on_pushButtonDeSelectAll_clicked();
  25. void on_buttonBox_rejected();
  26. void on_buttonBox_accepted();
  27. private:
  28. void createModel();
  29. void createUI();
  30. private:
  31. Ui::AddRegionTerminalsDialog *ui;
  32. QSqlQueryModel *modelRegions;
  33. QList<int> checkedTerminals; //Список выбранных терминалов
  34.  
  35. };
  36.  
  37. #endif // ADDREGIONTERMINALSDIALOG_H

addregionterminalsdialog.сpp

  1. #include "addregionterminalsdialog.h"
  2. #include "ui_addregionterminalsdialog.h"
  3. #include "LoggingCategories/loggingcategories.h"
  4. #include "DataBases/options.h"
  5. #include <QCheckBox>
  6.  
  7. AddRegionTerminalsDialog::AddRegionTerminalsDialog(QWidget *parent) :
  8. QDialog(parent),
  9. ui(new Ui::AddRegionTerminalsDialog)
  10.  
  11. {
  12. ui->setupUi(this);
  13. checkedTerminals.clear(); //Очищаем список
  14. createModel();
  15. createUI();
  16. }
  17.  
  18. AddRegionTerminalsDialog::~AddRegionTerminalsDialog()
  19. {
  20. delete ui;
  21. }
  22.  
  23. QList<int> AddRegionTerminalsDialog::getTerminalsLists()
  24. {
  25. return checkedTerminals;
  26. }
  27.  
  28. void AddRegionTerminalsDialog::createModel()
  29. {
  30. modelRegions = new QSqlQueryModel(this);
  31. Options opt;
  32. if(opt.getOption(1010).toBool()){
  33. modelRegions->setQuery("select t.region_id, trim(t.NAME) from TERMINALS t "
  34. "where t.TERMINALTYPE=2 "
  35. "order by t.TERMINAL_ID ");
  36. } else {
  37. modelRegions->setQuery("select t.terminal_id, trim(t.NAME) from TERMINALS t "
  38. "where t.TERMINALTYPE=2 "
  39. "order by t.TERMINAL_ID ");
  40. }
  41. }
  42.  
  43. void AddRegionTerminalsDialog::createUI()
  44. {
  45. ui->comboBoxRegions->setModel(modelRegions);
  46. ui->comboBoxRegions->setModelColumn(1);
  47. ui->comboBoxRegions->setCurrentIndex(0);
  48.  
  49. ui->tableWidgetTerm->setColumnCount(3);
  50. ui->tableWidgetTerm->setHorizontalHeaderLabels(QStringList() << "" << "АЗС" << "Наименование");
  51. ui->tableWidgetTerm->verticalHeader()->hide();
  52. ui->tableWidgetTerm->resizeColumnsToContents();
  53. ui->tableWidgetTerm->horizontalHeader()->setStretchLastSection(true);
  54. ui->comboBoxRegions->activated(0);
  55. ui->tableWidgetTerm->setFocus();
  56. }
  57.  
  58. void AddRegionTerminalsDialog::on_comboBoxRegions_activated(int idx)
  59. {
  60. //Получаем код региона из Модели привязанной к ComboBox
  61. int ownerid = modelRegions->data(modelRegions->index(idx,0,QModelIndex())).toInt();
  62.  
  63. //Очищаем TableWidget
  64. ui->tableWidgetTerm->clear();
  65. ui->tableWidgetTerm->setRowCount(0);
  66. ui->tableWidgetTerm->setHorizontalHeaderLabels(QStringList() << "" << "АЗС" << "Наименование");
  67.  
  68. //Получаем список терминалов выбранного региона и заполняем ими табличную часть
  69. QSqlQuery q;
  70. q.prepare("select DISTINCT t.terminal_id, TRIM(t.NAME) from TERMINALS t "
  71. "LEFT JOIN shifts s ON s.TERMINAL_ID = t.TERMINAL_ID "
  72. "where t.OWNER_ID=:ownerid and s.SHIFT_ID>1 "
  73. "order by t.TERMINAL_ID");
  74. q.bindValue(":ownerid", ownerid);
  75. if(!q.exec()) qCritical(logCritical()) << "Не возможно получит данные по региону" << ownerid << q.lastError().text();
  76. int row = 0;
  77. while(q.next()) {
  78. ui->tableWidgetTerm->insertRow(row);
  79. QWidget *checkBoxWidget = new QWidget();
  80. QCheckBox *checkBox = new QCheckBox();
  81. QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget);
  82. layoutCheckBox->addWidget(checkBox);
  83. layoutCheckBox->setAlignment(Qt::AlignCenter);
  84. layoutCheckBox->setContentsMargins(0,0,0,0);
  85. checkBox->setChecked(true);
  86.  
  87. ui->tableWidgetTerm->setCellWidget(row,0,checkBoxWidget);
  88. ui->tableWidgetTerm->setItem(row,1, new QTableWidgetItem(q.value(0).toString()));
  89. ui->tableWidgetTerm->setItem(row,2,new QTableWidgetItem(q.value(1).toString()));
  90. ++row;
  91. }
  92.  
  93. ui->tableWidgetTerm->resizeColumnsToContents();
  94. ui->tableWidgetTerm->horizontalHeader()->setStretchLastSection(true);
  95. ui->tableWidgetTerm->verticalHeader()->setDefaultSectionSize(ui->tableWidgetTerm->verticalHeader()->minimumSectionSize());
  96. }
  97. //Выбор всех терминалов
  98. void AddRegionTerminalsDialog::on_pushButtonSelectAll_clicked()
  99. {
  100. const int rowCount = ui->tableWidgetTerm->rowCount();
  101. for(int i = 0; i < rowCount; ++i){
  102. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  103. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  104. checkBox->setChecked(true);
  105. }
  106. }
  107. //Снятие выбора у всех терминалов
  108. void AddRegionTerminalsDialog::on_pushButtonDeSelectAll_clicked()
  109. {
  110. const int rowCount = ui->tableWidgetTerm->rowCount();
  111. for(int i = 0; i < rowCount; ++i){
  112. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  113. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  114. checkBox->setChecked(false);
  115. }
  116. }
  117.  
  118. void AddRegionTerminalsDialog::on_buttonBox_rejected()
  119. {
  120. this->reject();
  121. }
  122. //Получаем список выбранных терминалов для передачи в родительский виджет
  123. void AddRegionTerminalsDialog::on_buttonBox_accepted()
  124. {
  125. checkedTerminals.clear();
  126. int rowCount = ui->tableWidgetTerm->rowCount();
  127. for(int i =0; i<rowCount; i++){
  128. QWidget *item = ui->tableWidgetTerm->cellWidget(i,0);
  129. QCheckBox *checkBox = qobject_cast<QCheckBox*>(item->layout()->itemAt(0)->widget());
  130. if(checkBox->isChecked()){
  131. checkedTerminals.append(ui->tableWidgetTerm->item(i,1)->data(Qt::DisplayRole).toInt());
  132. }
  133. }
  134. this->accept();
  135. }

Остальные диалоги выбора терминалов организованы аналогичным способом.

В результате пользователю предоставлен интерфейс для быстрого выбора терминалов для дальнейшей работы с наименованиями видов топлива.

Архив проекта
iMposCh009.zip iMposCh009.zip

Мақала бойынша сұралады0сұрақтар(лар)

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Evgenii Legotckoi
  • Там. 5, 2019, 3:02 Т.Қ.

Добрый день. Вижу все слоты добавляли через дизайнер. Почему не делаете это через код?

Проблема добавления слотов через диайнер в том, что если поменять в дизайнере имя объекта, то слоты сразу протухают, при этом проект компилируется. Иногда можно забыться и очень много времен потратить не понимая, почему не работает.

Ruslan Polupan
  • Там. 5, 2019, 10:10 Т.Қ.

Добрый день. Наступал на эти грабли.
Сейчас обязательные действия это присвоениям всем элементам управления диалога осмысленных имен в процесе проектирования внешнего вида. Вернее сначала присваиваю а вотом уже занимаюсь размещением.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз