Зберігання інформації про поточного користувача
Після відкриття головного вікна програми хотілося б, щоб у рядку стану відображалося ім'я поточного користувача та інформація про підключення до центральної бази даних.
Також хотілося обмежити права користувача деякі дії. Тобто. користувачу з usder_id відмінним від 1 було доступно урізаний функціонал програми.
Для зберігання id поточного користувача додати опцію 1020. Для цього до методу
DataBases::connectOptions()
додамо ще один запит для створення опції.
listSQL << "INSERT INTO `options`(`option_id`,`value`,`comment`) VALUES (1020, '1', 'Текущий пользователь системы')";
Якщо змінити параметр 1000 (Використовувати автентифікацію) необхідно і встановити id поточного користувача рівним 1. Тобто. якщо пароль не запитуємо, то система працює з правами адміністратора. Якщо база даних може це зробити, то нехай займається, тому слідкувати за значенням встановлюваного параметра доручимо SQLite.
Для цього додамо в базу даних тригер який і стежитиме за значенням опції 1000:
listSQL << "CREATE TRIGGER use_login AFTER UPDATE " "ON options WHEN (SELECT value FROM options WHERE option_id =1000) = 'false' OR (SELECT value FROM options WHERE option_id =1000) = 0 " "BEGIN " "UPDATE options SET value = 1 WHERE option_id= 1020; " "END";
Якщо значення встановлюється як 'false' або 0, то відбувається скидання id користувача на значення 1.
Додамо запис у таблицю options id користувача, що успішно увійшов до системи.
void LoginDialog::on_buttonBox_accepted() { if(ui->comboBoxUser->currentIndex()>=0) { if(userPass==ui->lineEditPass->text().trimmed()) { qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText()); //Запись в таблицу options ID пользователя Options opt; opt.setOption(1020,QString::number(userID)); this->accept(); } else { ui->labelInfo->setText("Не верный пароль!"); qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText()); ui->lineEditPass->clear(); } } }
Відображення інформації про підключення та поточного користувача
Інформацію про поточного користувача та підключення до бази даних будемо відображати у рядку стану головного вікна.
Метод void createUI() здійснюватиме початкове налаштування зовнішнього вигляду головного вікна, викликаємо його у конструкторі MainWindow.
void MainWindow::createUI() { //Создаем два QLabels которые поместим в StatusBar QLabel *labelUsers = new QLabel(); QLabel *labelConnections = new QLabel(); //Получаем данные о текущем пользователе QSqlDatabase db = QSqlDatabase::database("options"); QSqlQuery q = QSqlQuery(db); q.exec("SELECT 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(0).toString()); //Получаем данные о текущем подключении QSqlDatabase dbcentr = QSqlDatabase::database(); labelConnections->setText("База данных:"+dbcentr.hostName()+":"+dbcentr.databaseName()); //Добавляем виджеты в строку состояния //Нормальное сообщение ui->statusBar->addWidget(labelUsers); //Постоянное сообщение ui->statusBar->addPermanentWidget(labelConnections); }
Створення меню
Відкриваємо форму mainwindow.ui.
У місце
Пишіть тут
пишемо найменування меню верхнього рівня: Інструменти
Нижче вказуємо назву пункту меню: Параметри...
До списку об'єктів додасться об'єкти menu і action, а в нижній частині з'явиться редактор дій.
Дамо об'єктам осмислені імена. Після цього подвійне клацання у редакторі дій і відриється вікно налаштування дій.
У ньому задаємо попередньо доданий до ресурсів значок для меню та гарячу клавішу.
Після цього перетягуємо дію на панель інструментів головного вікна.
Правою кнопкою на дії, виберіть перейти до слота. Нас цікавить слот triggered(). Отримуємо слот, який вже пов'язаний з вибором пункту меню або натисканням кнопки на панелі інструментів.
void MainWindow::on_actionSettings_triggered() { }
Діалогове вікно налаштувань
Створюємо новий клас форми Qt Designer Settings Dialog. У редакторі ресурсів додаємо необхідні елементи керування присвоюємо їм осмислені імена та виконуємо компонування.
У MainWindow::on_actionSettings_triggered() будемо здійснювати виклик діалогу, попередньо підключивши заголовний файл класу діалогу.
void MainWindow::on_actionSettings_triggered() { //Создаем объект диалога SettingsDialog *settingsDlg = new SettingsDialog(); //позиционируем диалог по центру главного окна settingsDlg->move(this->geometry().center().x() - settingsDlg->geometry().center().x(), this->geometry().center().y() - settingsDlg->geometry().center().y()); //Отображаем диалог settingsDlg->exec(); }
Перевіряємо.
Реалізація роботи діалогу налаштувань:
settingsdialog.h
#ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include "DataBases/options.h" #include <QDialog> namespace Ui { class SettingsDialog; } class SettingsDialog : public QDialog { Q_OBJECT public: explicit SettingsDialog(QWidget *parent = nullptr); ~SettingsDialog(); private slots: void on_buttonBox_accepted(); private: Ui::SettingsDialog *ui; Options opt; //чтение запись таблицы options private: void createUI(); //Настройка первоначального интерфейса }; #endif // SETTINGSDIALOG_H
settingsdialog.cpp
#include "settingsdialog.h" #include "ui_settingsdialog.h" SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); createUI(); } SettingsDialog::~SettingsDialog() { delete ui; } void SettingsDialog::createUI() { //Устанавливаем сотояния в зависимости от значений в таблице ui->checkBoxLogin->setChecked(opt.getOption(1000).toBool()); ui->checkBoxRegions->setChecked(opt.getOption(1010).toBool()); } void SettingsDialog::on_buttonBox_accepted() { //Записываем в таблицу состояние opt.setOption(1000,QVariant(ui->checkBoxLogin->isChecked()).toString()); opt.setOption(1010,QVariant(ui->checkBoxRegions->isChecked()).toString()); }
Файл проекту:
iMposCh007.zip
Поточний стан проекту
https://github.com/rust3128/iMpos