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