Ruslan Polupan
Шілде 21, 2019, 12:58 Т.Қ.

iMpos жобасы. Бөлім 007. Қосылым және ағымдағы пайдаланушы туралы ақпаратты көрсету. Мәзір құру. Қолданба параметрлерінің диалогтық терезесі.

Хранение информации о текущем пользователе

После открытия главного окна приложения хотелось бы чтобы в строке состояния отображалось имя текущего пользователя и информация о подключении к центральной базе данных.
Также хотелось ограничить права пользователя на некоторые действия. Т.е. пользователю с usder_id отличным от 1 было доступен урезанный функционал приложения.
Для хранения id текущего пользователя добавить опцию 1020. Для этого в метод DataBases::connectOptions() добавим еще один запрос жля создания опции.

  1. listSQL << "INSERT INTO `options`(`option_id`,`value`,`comment`) VALUES (1020, '1', 'Текущий пользователь системы')";

Если изменить параметр 1000 (Использовать аутентификацию) то необходимо и установить id текущего пользователя равным 1. Т.е. если пароль не спрашиваем то система работает с правами администратора. Если база данных может это сделать то пусть занимается, поэтому следить за значением устанавливаемого параметра поручим SQLite.
Для этого добавим в базу данных триггер который и будет следить за значением опции 1000:

  1. listSQL << "CREATE TRIGGER use_login AFTER UPDATE "
  2. "ON options WHEN (SELECT value FROM options WHERE option_id =1000) = 'false' OR (SELECT value FROM options WHERE option_id =1000) = 0 "
  3. "BEGIN "
  4. "UPDATE options SET value = 1 WHERE option_id= 1020; "
  5. "END";

Если значение устанавливается как ’false’ или 0 то происходит сброс id пользователя на значение 1.
Добавим запись в таблицу options id пользователя успешно вошедшего в систему.

  1. void LoginDialog::on_buttonBox_accepted()
  2. {
  3. if(ui->comboBoxUser->currentIndex()>=0) {
  4. if(userPass==ui->lineEditPass->text().trimmed()) {
  5. qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText());
  6. //Запись в таблицу options ID пользователя
  7. Options opt;
  8. opt.setOption(1020,QString::number(userID));
  9. this->accept();
  10. } else {
  11. ui->labelInfo->setText("Не верный пароль!");
  12. qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText());
  13. ui->lineEditPass->clear();
  14. }
  15. }
  16. }
  17.  

Отображение информации о подключении и текущем пользователе

Информацию о текущем пользователе и подключении к базе данных будем отображать в строке состояния главного окна.
Метод void createUI() будет осуществлять первоначальную настройку внешнего вида главного окна, вызываем его в конструкторе MainWindow.

  1. void MainWindow::createUI()
  2. {
  3. //Создаем два QLabels которые поместим в StatusBar
  4. QLabel *labelUsers = new QLabel();
  5. QLabel *labelConnections = new QLabel();
  6. //Получаем данные о текущем пользователе
  7. QSqlDatabase db = QSqlDatabase::database("options");
  8. QSqlQuery q = QSqlQuery(db);
  9. q.exec("SELECT u.fio FROM users u "
  10. "INNER JOIN options o ON u.user_id = o.value "
  11. "WHERE o.option_id = 1020");
  12. q.next();
  13. labelUsers->setText("Пользователь: "+q.value(0).toString());
  14. //Получаем данные о текущем подключении
  15. QSqlDatabase dbcentr = QSqlDatabase::database();
  16. labelConnections->setText("База данных:"+dbcentr.hostName()+":"+dbcentr.databaseName());
  17. //Добавляем виджеты в строку состояния
  18. //Нормальное сообщение
  19. ui->statusBar->addWidget(labelUsers);
  20. //Постоянное сообщение
  21. ui->statusBar->addPermanentWidget(labelConnections);
  22. }

Создание меню

Открываем форму mainwindow.ui.
В место Пишите здесь пишем наименование меню верхнего уровня: Инструменты


Ниже указываем название пункта меню: Параметры...
В список обхектов добавится объекты menu и action, а в нижней части отобразится редактор действий.


Дадим объектам осмысленнные имена. После этого двойной щелчек в редакторе действий и отроется окно настройки действий.
В нем задаем предварительно добавленный в ресурсы значек для меню и горячую клавишу.

После этого перетаскиваем действие на панель инструментов главного окна.

Правой кнопкой на действии, выбераем перейти к слоту. Нас интересует слот triggered(). Получаем слот который уже связан с выбором пункта меню или нажатием кнопки на панели инструментов.

  1. void MainWindow::on_actionSettings_triggered()
  2. {
  3.  
  4. }

Диалоговое окно настроек

Создаем новый класс формы Qt Designer SettingsDialog. В редакторе ресурсов добавляем необходимые элементы управления присваиваем им осмысленные имена и выполняем компоновку.

В MainWindow::on_actionSettings_triggered() будем осуществлять вызов диалога, предварительно подключив заголовочный файл класса диалога.

  1. void MainWindow::on_actionSettings_triggered()
  2. {
  3. //Создаем объект диалога
  4. SettingsDialog *settingsDlg = new SettingsDialog();
  5. //позиционируем диалог по центру главного окна
  6. settingsDlg->move(this->geometry().center().x() - settingsDlg->geometry().center().x(),
  7. this->geometry().center().y() - settingsDlg->geometry().center().y());
  8. //Отображаем диалог
  9. settingsDlg->exec();
  10. }

Проверяем.

Реализация работы диалога настроек:
settingsdialog.h

  1. #ifndef SETTINGSDIALOG_H
  2. #define SETTINGSDIALOG_H
  3.  
  4. #include "DataBases/options.h"
  5. #include <QDialog>
  6.  
  7. namespace Ui {
  8. class SettingsDialog;
  9. }
  10.  
  11. class SettingsDialog : public QDialog
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. explicit SettingsDialog(QWidget *parent = nullptr);
  17. ~SettingsDialog();
  18.  
  19. private slots:
  20. void on_buttonBox_accepted();
  21.  
  22. private:
  23. Ui::SettingsDialog *ui;
  24. Options opt; //чтение запись таблицы options
  25. private:
  26. void createUI(); //Настройка первоначального интерфейса
  27. };
  28.  
  29. #endif // SETTINGSDIALOG_H

settingsdialog.cpp

  1. #include "settingsdialog.h"
  2. #include "ui_settingsdialog.h"
  3.  
  4.  
  5. SettingsDialog::SettingsDialog(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::SettingsDialog)
  8. {
  9. ui->setupUi(this);
  10. createUI();
  11. }
  12.  
  13. SettingsDialog::~SettingsDialog()
  14. {
  15. delete ui;
  16. }
  17.  
  18. void SettingsDialog::createUI()
  19. {
  20. //Устанавливаем сотояния в зависимости от значений в таблице
  21. ui->checkBoxLogin->setChecked(opt.getOption(1000).toBool());
  22. ui->checkBoxRegions->setChecked(opt.getOption(1010).toBool());
  23. }
  24.  
  25.  
  26. void SettingsDialog::on_buttonBox_accepted()
  27. {
  28. //Записываем в таблицу состояние
  29. opt.setOption(1000,QVariant(ui->checkBoxLogin->isChecked()).toString());
  30. opt.setOption(1010,QVariant(ui->checkBoxRegions->isChecked()).toString());
  31. }

Файл проекта:
iMposCh007.zip iMposCh007.zip
Текущее состояние проекта https://github.com/rust3128/iMpos

Мақала бойынша сұралады0сұрақтар(лар)

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз