Ruslan Polupan
July 22, 2019, 9:57 p.m.

IMpos project. Part 008. Editing the user guide

Dialog for editing the user directory

In the mainwindow.ui form, add the Users menu item to which the actionUsers object corresponds. Assign an icon and a hotkey to it.
Create a Qt Designer Form Class named UsersDialog.
In the MainWindow::on_actionUsers_triggered() slot, we implement the call to the Users dialog.


  1. void MainWindow::on_actionUsers_triggered()
  2. {
  3. UsersDialog *usersDlg = new UsersDialog(this);
  4. usersDlg->move(this->geometry().center().x() - usersDlg->geometry().center().x(),
  5. this->geometry().center().y() - usersDlg->geometry().center().y());
  6. usersDlg->exec();
  7. }

We add controls to the dialog using Qt Designer.

Implementation of the UserDialog class
userdialog.h

  1. #ifndef USERSDIALOG_H
  2. #define USERSDIALOG_H
  3.  
  4. #include <QDialog>
  5. #include <QSqlQuery>
  6. #include <QSqlError>
  7. #include <QTableWidgetItem>
  8.  
  9. namespace Ui {
  10. class UsersDialog;
  11. }
  12.  
  13. class UsersDialog : public QDialog
  14. {
  15. Q_OBJECT
  16.  
  17. public:
  18. explicit UsersDialog(QWidget *parent = nullptr);
  19. ~UsersDialog();
  20.  
  21. private slots:
  22. void on_pushButtonAdd_clicked();
  23. void on_buttonBox_accepted();
  24. void on_tableWidget_itemSelectionChanged();
  25. void on_buttonBox_rejected();
  26. void on_pushButtonEdit_clicked();
  27. void on_pushButtonClose_clicked();
  28. void on_tableWidget_cellDoubleClicked(int row, int column);
  29.  
  30. private:
  31. void createUI(); //Создание первоначального интерефейса
  32. void createTable(); //Заолнение TableWidget
  33. private:
  34. Ui::UsersDialog *ui;
  35. QSqlDatabase db; // Объект Базы данных
  36. QTableWidgetItem *currentItem; //Текущий оператор.
  37. bool isNew; //Выполняется добавление оператора или правка
  38.  
  39. };
  40.  
  41. #endif // USERSDIALOG_H

userdialog.cpp

  1. #include "usersdialog.h"
  2. #include "ui_usersdialog.h"
  3. #include "LoggingCategories/loggingcategories.h"
  4. #include <QMessageBox>
  5.  
  6.  
  7. UsersDialog::UsersDialog(QWidget *parent) :
  8. QDialog(parent),
  9. ui(new Ui::UsersDialog)
  10. {
  11. ui->setupUi(this);
  12.  
  13. //Используем соединение options
  14. db = QSqlDatabase::database("options");
  15.  
  16. createUI();
  17. }
  18.  
  19. UsersDialog::~UsersDialog()
  20. {
  21. delete ui;
  22. }
  23.  
  24. void UsersDialog::createUI()
  25. {
  26. ui->groupBoxUserData->hide(); //Скрываем информацию о пользователе.
  27. ui->checkBoxIsActive->setChecked(true); //Устанавливаем выбранным
  28. //Колличество столбцов
  29. ui->tableWidget->setColumnCount(5);
  30. //Заолняем TableWidget данными
  31. createTable();
  32. }
  33.  
  34. void UsersDialog::createTable()
  35. {
  36. //заголовки столбцов
  37. ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"ID"<<"Логин"<<"Пароль"<<""<<"Активность");
  38. QSqlQuery q = QSqlQuery(db);
  39. //Получаем список пользователей
  40. if(!q.exec("select user_id, fio, password, isactive FROM users order by user_id"))
  41. qCritical(logCritical())<< "Не возможно получить список пользователей" << q.lastError().text();
  42. int i = 0; //Текущая строка
  43. //Создаем и заполняем таблицу пользователей
  44. while(q.next()){
  45. ui->tableWidget->insertRow(i);
  46. ui->tableWidget->setItem(i,0,new QTableWidgetItem(q.value(0).toString()));
  47. ui->tableWidget->setItem(i,1,new QTableWidgetItem(q.value(1).toString()));
  48. ui->tableWidget->setItem(i,2,new QTableWidgetItem(q.value(2).toString()));
  49. ui->tableWidget->setItem(i,3,new QTableWidgetItem(q.value(3).toString()));
  50. if(q.value(3).toBool()){
  51. ui->tableWidget->setItem(i,4, new QTableWidgetItem(QIcon(":/Image/userActive.png"),"Активен"));
  52. } else {
  53. ui->tableWidget->setItem(i,4, new QTableWidgetItem(QIcon(":/Image/userNoActive.png"),"Не Активен"));
  54. }
  55. ++i;
  56. }
  57. //Скрываем горизонтальный заголовок и 3-й столбец
  58. ui->tableWidget->verticalHeader()->hide();
  59. ui->tableWidget->hideColumn(3);
  60. //Ширина колонки по содержимому
  61. ui->tableWidget->resizeColumnsToContents();
  62. //Высота сторок
  63. ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
  64. ui->pushButtonEdit->setDisabled(true);
  65.  
  66. }
  67.  
  68. void UsersDialog::on_pushButtonAdd_clicked()
  69. {
  70. ui->groupBoxUserData->show();
  71. ui->tableWidget->setDisabled(true);
  72. ui->pushButtonAdd->setDisabled(true);
  73. ui->pushButtonEdit->setDisabled(true);
  74. isNew = true;
  75. }
  76.  
  77. void UsersDialog::on_buttonBox_accepted()
  78. {
  79. //Простая проверка заполнения полей
  80. if(ui->lineEditLogin->text().size()<3 || ui->lineEditPass->text().size()<1) {
  81. QMessageBox::warning(this,"Ошибка","Не заполнены обязательные поля.");
  82. return;
  83. }
  84. QSqlQuery q = QSqlQuery(db);
  85. if(isNew){
  86. //Новая запись
  87. q.prepare("INSERT INTO `users`(`fio`,`password`) VALUES (:userName,:passw)");
  88. q.bindValue(":userName", ui->lineEditLogin->text().trimmed());
  89. q.bindValue(":passw", ui->lineEditPass->text().trimmed());
  90. if(q.exec()){
  91. //Очищаем TableWidget
  92. ui->tableWidget->clear();
  93. ui->tableWidget->setRowCount(0);
  94. //Заолняем TableWidget обновленными данными
  95. createTable();
  96. } else {
  97. qInfo(logInfo()) << "Не удалось добавить опреатора" << q.lastError().text();
  98. }
  99. } else {
  100. //Редактируем запись
  101. q.prepare("UPDATE users SET fio = :userName, password = :passw, isactive = :isactive WHERE user_id = :userid");
  102. q.bindValue(":userName", ui->lineEditLogin->text().trimmed());
  103. q.bindValue(":passw", ui->lineEditPass->text().trimmed());
  104. q.bindValue(":isactive",(ui->checkBoxIsActive->isChecked()) ? "true" : "false" );
  105. q.bindValue(":userid", ui->tableWidget->item(currentItem->row(),0)->text());
  106. if(q.exec()){
  107. //Очищаем TableWidget
  108. ui->tableWidget->clear();
  109. ui->tableWidget->setRowCount(0);
  110. //Заолняем TableWidget обновленными данными
  111. createTable();
  112. } else {
  113. qInfo(logInfo()) << "Не удалось обновить данные оператора опреатора" << q.lastError().text();
  114. }
  115. }
  116. ui->groupBoxUserData->hide();
  117. ui->tableWidget->setEnabled(true);
  118. ui->tableWidget->clearSelection();
  119. ui->pushButtonAdd->setEnabled(true);
  120. ui->lineEditPass->clear();
  121. ui->lineEditLogin->clear();
  122. }
  123.  
  124. void UsersDialog::on_buttonBox_rejected()
  125. {
  126. ui->groupBoxUserData->hide();
  127. ui->tableWidget->setEnabled(true);
  128. ui->pushButtonAdd->setEnabled(true);
  129. ui->tableWidget->clearSelection();
  130. ui->lineEditPass->clear();
  131. ui->lineEditLogin->clear();
  132. }
  133.  
  134. void UsersDialog::on_tableWidget_itemSelectionChanged()
  135. {
  136. //Получаем текущее выделение
  137. currentItem = ui->tableWidget->currentItem();
  138. //разрешаем редактирование
  139. ui->pushButtonEdit->setEnabled(true);
  140. }
  141.  
  142. void UsersDialog::on_pushButtonEdit_clicked()
  143. {
  144. ui->groupBoxUserData->show();
  145. ui->tableWidget->setDisabled(true);
  146. ui->pushButtonAdd->setDisabled(true);
  147. ui->pushButtonEdit->setDisabled(true);
  148. //Заполняем объекты данными о выбранном пользователе
  149. ui->lineEditLogin->setText(ui->tableWidget->item(currentItem->row(),1)->text());
  150. ui->lineEditPass->setText(ui->tableWidget->item(currentItem->row(),2)->text());
  151. ui->checkBoxIsActive->setChecked(QVariant(ui->tableWidget->item(currentItem->row(),3)->text()).toBool());
  152.  
  153. isNew = false;
  154.  
  155. }
  156.  
  157. void UsersDialog::on_pushButtonClose_clicked()
  158. {
  159. this->reject();
  160. }
  161.  
  162. void UsersDialog::on_tableWidget_cellDoubleClicked(int row, int column)
  163. {
  164. //Вызываем редактирование по двойнгому щелчку мыши
  165. Q_UNUSED(row);
  166. Q_UNUSED(column);
  167. on_pushButtonEdit_clicked();
  168. }

We launch the Settings-Users program, add a new one.

Access restriction

In order to restrict access to settings for all users except the Administrator in MainWindow::createUI() , we will change the request to obtain data about the current user and, if uiser_id is not equal to 1, deactivate the corresponding actions.

  1. q.exec("SELECT u.user_id, u.fio FROM users u "
  2. "INNER JOIN options o ON u.user_id = o.value "
  3. "WHERE o.option_id = 1020");
  4. q.next();
  5. labelUsers->setText("Пользователь: "+q.value(1).toString());
  6. if(q.value(0).toInt() != 1){
  7. ui->actionUsers->setEnabled(false);
  8. ui->actionSettings->setEnabled(false);
  9. }

We go under the new user. The menu items in the Tools menu are not active.

Project archive

iMposCh008.zip iMposCh008.zip

By article asked0question(s)

2

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • AK
    April 1, 2025, 11:41 a.m.
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup