Ruslan Polupan
22 июля 2019 г. 21:57

Проект iMpos. Часть 008. Редактирование справочника пользователей

Диалог редактирование справочника пользователей

В форме mainwindow.ui добавляем пункт меню Пользователи которому соответвует объект actionUsers. Назначаем ему значок и горячую клавишу.
Создаем Класс формы Qt Designer с именем UsersDialog.
В слоте MainWindow::on_actionUsers_triggered() реализуем вызов диалога Пользователи.


  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. }

Добавляем в диалог, используя Qt Designer, элементы управления.

Реализация класса UserDialog
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. }

Запускаем программу Натройки-Пользователи, добавляем нового.

Огрничение доступа

Для того чтобы ограничить всем пользователям кроме Администратора доступ к настройкам в MainWindow::createUI() изменим запрос для получения данных о текущем пользователе и если uiser_id не равен 1 деактивируем соответсвующие 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. }

Заходим под новым пользователем. Пункты меню в меню Инструменты не активны.

Архив проекта

iMposCh008.zip iMposCh008.zip

По статье задано0вопрос(ов)

2

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 ноября 2024 г. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…