Ruslan Polupan
Ruslan Polupan22 липня 2019 р. 11:57

Проект iMpos. Частина 008. Редагування довідника користувачів

Діалог редагування довідника користувачів

У формі mainwindow.ui додаємо пункт меню Користувачі, якому відповідає об'єкт actionUsers. Призначаємо йому піктограму та гарячу клавішу.
Створюємо клас форми Qt Designer з ім'ям UsersDialog.
У слоті MainWindow::on_actionUsers_triggered() реалізуємо виклик діалогу Користувачі.


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();
}

Додаємо до діалогу, використовуючи Qt Designer, елементи управління.

Реалізація класу UserDialog
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();
}

Запускаємо програму Натрійки-Користувачі, додаємо нового.

Обрізання доступу

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

Заходимо під новим юзером. Пункти меню в меню Інструменти не активні.

Архів проекту

iMposCh008.zip iMposCh008.zip

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 08:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall15 листопада 2024 р. 03:03
Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 листопада 2024 р. 19:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 17:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 листопада 2024 р. 12:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 11:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 18:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 11:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах