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.
- void MainWindow::on_actionUsers_triggered()
- {
- UsersDialog *usersDlg = new UsersDialog(this);
- usersDlg->move(this->geometry().center().x() - usersDlg->geometry().center().x(),
- this->geometry().center().y() - usersDlg->geometry().center().y());
- usersDlg->exec();
- }
We add controls to the dialog using Qt Designer.
Implementation of the UserDialog class
userdialog.h
- #ifndef USERSDIALOG_H
- #define USERSDIALOG_H
- #include <QDialog>
- #include <QSqlQuery>
- #include <QSqlError>
- #include <QTableWidgetItem>
- namespace Ui {
- class UsersDialog;
- }
- class UsersDialog : public QDialog
- {
- Q_OBJECT
- public:
- explicit UsersDialog(QWidget *parent = nullptr);
- ~UsersDialog();
- private slots:
- void on_pushButtonAdd_clicked();
- void on_buttonBox_accepted();
- void on_tableWidget_itemSelectionChanged();
- void on_buttonBox_rejected();
- void on_pushButtonEdit_clicked();
- void on_pushButtonClose_clicked();
- void on_tableWidget_cellDoubleClicked(int row, int column);
- private:
- void createUI(); //Создание первоначального интерефейса
- void createTable(); //Заолнение TableWidget
- private:
- Ui::UsersDialog *ui;
- QSqlDatabase db; // Объект Базы данных
- QTableWidgetItem *currentItem; //Текущий оператор.
- bool isNew; //Выполняется добавление оператора или правка
- };
- #endif // USERSDIALOG_H
userdialog.cpp
- #include "usersdialog.h"
- #include "ui_usersdialog.h"
- #include "LoggingCategories/loggingcategories.h"
- #include <QMessageBox>
- UsersDialog::UsersDialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::UsersDialog)
- {
- ui->setupUi(this);
- //Используем соединение options
- db = QSqlDatabase::database("options");
- createUI();
- }
- UsersDialog::~UsersDialog()
- {
- delete ui;
- }
- void UsersDialog::createUI()
- {
- ui->groupBoxUserData->hide(); //Скрываем информацию о пользователе.
- ui->checkBoxIsActive->setChecked(true); //Устанавливаем выбранным
- //Колличество столбцов
- ui->tableWidget->setColumnCount(5);
- //Заолняем TableWidget данными
- createTable();
- }
- void UsersDialog::createTable()
- {
- //заголовки столбцов
- ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"ID"<<"Логин"<<"Пароль"<<""<<"Активность");
- QSqlQuery q = QSqlQuery(db);
- //Получаем список пользователей
- if(!q.exec("select user_id, fio, password, isactive FROM users order by user_id"))
- qCritical(logCritical())<< "Не возможно получить список пользователей" << q.lastError().text();
- int i = 0; //Текущая строка
- //Создаем и заполняем таблицу пользователей
- while(q.next()){
- ui->tableWidget->insertRow(i);
- ui->tableWidget->setItem(i,0,new QTableWidgetItem(q.value(0).toString()));
- ui->tableWidget->setItem(i,1,new QTableWidgetItem(q.value(1).toString()));
- ui->tableWidget->setItem(i,2,new QTableWidgetItem(q.value(2).toString()));
- ui->tableWidget->setItem(i,3,new QTableWidgetItem(q.value(3).toString()));
- if(q.value(3).toBool()){
- ui->tableWidget->setItem(i,4, new QTableWidgetItem(QIcon(":/Image/userActive.png"),"Активен"));
- } else {
- ui->tableWidget->setItem(i,4, new QTableWidgetItem(QIcon(":/Image/userNoActive.png"),"Не Активен"));
- }
- ++i;
- }
- //Скрываем горизонтальный заголовок и 3-й столбец
- ui->tableWidget->verticalHeader()->hide();
- ui->tableWidget->hideColumn(3);
- //Ширина колонки по содержимому
- ui->tableWidget->resizeColumnsToContents();
- //Высота сторок
- ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
- ui->pushButtonEdit->setDisabled(true);
- }
- void UsersDialog::on_pushButtonAdd_clicked()
- {
- ui->groupBoxUserData->show();
- ui->tableWidget->setDisabled(true);
- ui->pushButtonAdd->setDisabled(true);
- ui->pushButtonEdit->setDisabled(true);
- isNew = true;
- }
- void UsersDialog::on_buttonBox_accepted()
- {
- //Простая проверка заполнения полей
- if(ui->lineEditLogin->text().size()<3 || ui->lineEditPass->text().size()<1) {
- QMessageBox::warning(this,"Ошибка","Не заполнены обязательные поля.");
- return;
- }
- QSqlQuery q = QSqlQuery(db);
- if(isNew){
- //Новая запись
- q.prepare("INSERT INTO `users`(`fio`,`password`) VALUES (:userName,:passw)");
- q.bindValue(":userName", ui->lineEditLogin->text().trimmed());
- q.bindValue(":passw", ui->lineEditPass->text().trimmed());
- if(q.exec()){
- //Очищаем TableWidget
- ui->tableWidget->clear();
- ui->tableWidget->setRowCount(0);
- //Заолняем TableWidget обновленными данными
- createTable();
- } else {
- qInfo(logInfo()) << "Не удалось добавить опреатора" << q.lastError().text();
- }
- } else {
- //Редактируем запись
- q.prepare("UPDATE users SET fio = :userName, password = :passw, isactive = :isactive WHERE user_id = :userid");
- q.bindValue(":userName", ui->lineEditLogin->text().trimmed());
- q.bindValue(":passw", ui->lineEditPass->text().trimmed());
- q.bindValue(":isactive",(ui->checkBoxIsActive->isChecked()) ? "true" : "false" );
- q.bindValue(":userid", ui->tableWidget->item(currentItem->row(),0)->text());
- if(q.exec()){
- //Очищаем TableWidget
- ui->tableWidget->clear();
- ui->tableWidget->setRowCount(0);
- //Заолняем TableWidget обновленными данными
- createTable();
- } else {
- qInfo(logInfo()) << "Не удалось обновить данные оператора опреатора" << q.lastError().text();
- }
- }
- ui->groupBoxUserData->hide();
- ui->tableWidget->setEnabled(true);
- ui->tableWidget->clearSelection();
- ui->pushButtonAdd->setEnabled(true);
- ui->lineEditPass->clear();
- ui->lineEditLogin->clear();
- }
- void UsersDialog::on_buttonBox_rejected()
- {
- ui->groupBoxUserData->hide();
- ui->tableWidget->setEnabled(true);
- ui->pushButtonAdd->setEnabled(true);
- ui->tableWidget->clearSelection();
- ui->lineEditPass->clear();
- ui->lineEditLogin->clear();
- }
- void UsersDialog::on_tableWidget_itemSelectionChanged()
- {
- //Получаем текущее выделение
- currentItem = ui->tableWidget->currentItem();
- //разрешаем редактирование
- ui->pushButtonEdit->setEnabled(true);
- }
- void UsersDialog::on_pushButtonEdit_clicked()
- {
- ui->groupBoxUserData->show();
- ui->tableWidget->setDisabled(true);
- ui->pushButtonAdd->setDisabled(true);
- ui->pushButtonEdit->setDisabled(true);
- //Заполняем объекты данными о выбранном пользователе
- ui->lineEditLogin->setText(ui->tableWidget->item(currentItem->row(),1)->text());
- ui->lineEditPass->setText(ui->tableWidget->item(currentItem->row(),2)->text());
- ui->checkBoxIsActive->setChecked(QVariant(ui->tableWidget->item(currentItem->row(),3)->text()).toBool());
- isNew = false;
- }
- void UsersDialog::on_pushButtonClose_clicked()
- {
- this->reject();
- }
- void UsersDialog::on_tableWidget_cellDoubleClicked(int row, int column)
- {
- //Вызываем редактирование по двойнгому щелчку мыши
- Q_UNUSED(row);
- Q_UNUSED(column);
- on_pushButtonEdit_clicked();
- }
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.
- q.exec("SELECT u.user_id, u.fio FROM users u "
- "INNER JOIN options o ON u.user_id = o.value "
- "WHERE o.option_id = 1020");
- q.next();
- labelUsers->setText("Пользователь: "+q.value(1).toString());
- if(q.value(0).toInt() != 1){
- ui->actionUsers->setEnabled(false);
- ui->actionSettings->setEnabled(false);
- }
We go under the new user. The menu items in the Tools menu are not active.
Project archive