Ruslan Polupan
19 июля 2019 г. 20:25

Проект iMpos. Часть 005. Чтение настроек приложения. Реализация диалога входа пользователя в систему.

Чтение настроек приложения

Настройки приложения хранятся в таблице options базы данных SQLite iMpos.opt.
Для получения и установки значений опций создаем класс Options и в нем реализуем соответствующие методы.


options.h

  1. #ifndef OPTIONS_H
  2. #define OPTIONS_H
  3.  
  4. #include <QObject>
  5. #include <QSqlQuery>
  6. #include <QSqlError>
  7. #include <QVariant>
  8.  
  9. class Options : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Options(QObject *parent = nullptr);
  14. QVariant getOption(int optionID); //Получение значения опции
  15. void setOption(int optionID, QString value); //Установка значения опции
  16.  
  17. signals:
  18.  
  19. public slots:
  20.  
  21. private:
  22. QSqlDatabase db; //База Данных
  23. };
  24.  
  25. #endif // OPTIONS_H

options.cpp

  1. #include "options.h"
  2. #include "LoggingCategories/loggingcategories.h"
  3.  
  4. Options::Options(QObject *parent) : QObject(parent)
  5. {
  6. //используем соедиенеие с базой данных options
  7. db = QSqlDatabase::database("options");
  8. }
  9.  
  10. QVariant Options::getOption(int optionID)
  11. {
  12. QSqlQuery q = QSqlQuery(db);
  13. q.prepare("SELECT value FROM options WHERE option_id=:optionID");
  14. q.bindValue(":optionID",optionID);
  15. if(!q.exec()) {
  16. qCritical(logCritical()) << "Не удалось получить значение опции" << optionID << ".Причина" << q.lastError().text();
  17. return QVariant();
  18. }
  19. q.next();
  20. return q.value(0);
  21. }
  22.  
  23. void Options::setOption(int optionID, QString value)
  24. {
  25. QSqlQuery q = QSqlQuery(db);
  26. q.prepare("UPDATE options SET value = :value WHERE option_ID = :optionID");
  27. q.bindValue(":optionID", optionID);
  28. q.bindValue(":value", value);
  29. if(!q.exec()) {
  30. qCritical(logCritical()) << "Не удалось обновить опцию" << optionID << "Причина" << q.lastError().text();
  31. }
  32. }

Подключаем в main.cpp заголовочные файлы options.h и logindialog.h и добавляем следующий код перед вызовом главного окна.

  1. Options opt;
  2. //Проверяем значение опции 1000
  3. if(opt.getOption(1000).toBool()){
  4. //Создаем диалогвое окно
  5. LoginDialog *loginDlg = new LoginDialog();
  6. loginDlg->exec();
  7. //Если вход не состоялся завершаем работу программы
  8. if(loginDlg->result() == QDialog::Rejected){
  9. QMessageBox::critical(nullptr,"Ошибка входа",
  10. "Не выполнен вход в систему!<br>Дальнейшая работа не возможна.");
  11. qCritical(logCritical()) << "Не выполнен вход в систему. Закрытие программы.";
  12. return 1;
  13. }
  14. }

Устанавливаем для проверки в таблице options значение опции 1000 равным true. Запускаем программу.

Диалог вызывается, а при его закрытии завершается работа программы.

Реализация диалога входа пользователя в систему.

Хочу обратить внимания на создание связки сигнал слот элементов упавления с применением Qt Designer.
Открываем нашу форму, правой кнопкой на объекте comboBoxUser, выбираем Перейти к слоту... . Выбираем сигнал activated(int).

И сразу попадаем реализацию слота. Все остальные манипуляции за нас выполнены.

  1. void LoginDialog::on_comboBoxUser_activated(int index)
  2. {
  3.  
  4. }
  5.  

logindialog.h

  1. #ifndef LOGINDIALOG_H
  2. #define LOGINDIALOG_H
  3.  
  4. #include <QDialog>
  5. #include <QSqlTableModel>
  6. #include <QSqlRecord>
  7. #include <QSqlError>
  8.  
  9. namespace Ui {
  10. class LoginDialog;
  11. }
  12.  
  13. class LoginDialog : public QDialog
  14. {
  15. Q_OBJECT
  16.  
  17. public:
  18. explicit LoginDialog(QWidget *parent = nullptr);
  19. ~LoginDialog();
  20.  
  21. private slots:
  22. void on_comboBoxUser_activated(int idx);
  23. void on_buttonBox_rejected();
  24. void on_buttonBox_accepted();
  25.  
  26. private:
  27. void createUI(); //Первоначальные настройки приложения
  28. void createModel(); //Создание модели пользователей
  29. private:
  30. Ui::LoginDialog *ui;
  31. QSqlTableModel *modelUsers; //Модель данных пользователей
  32. int userID; //ID выбранного пользователя
  33. QString userPass; //Пароль выбранного пользователя из базы данных
  34. };
  35.  
  36. #endif // LOGINDIALOG_H

logindialog.cpp

  1. #include "logindialog.h"
  2. #include "ui_logindialog.h"
  3. #include "LoggingCategories/loggingcategories.h"
  4.  
  5. LoginDialog::LoginDialog(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::LoginDialog)
  8. {
  9. ui->setupUi(this);
  10.  
  11. createModel();
  12. createUI();
  13. }
  14.  
  15. LoginDialog::~LoginDialog()
  16. {
  17. delete ui;
  18. }
  19.  
  20. void LoginDialog::createUI()
  21. {
  22. //Очишаем информационное сообщение
  23. ui->labelInfo->clear();
  24.  
  25. //Связываем модель и comboBox
  26. ui->comboBoxUser->setModel(modelUsers);
  27. //Устанавливаем отображение в comboBox столбца с номером 1
  28. ui->comboBoxUser->setModelColumn(1);
  29. //Текущий индекс -1 т.е. ничего не выбрано
  30. ui->comboBoxUser->setCurrentIndex(-1);
  31.  
  32. }
  33.  
  34. void LoginDialog::createModel()
  35. {
  36. //Используем соединение с базой данный options
  37. QSqlDatabase db = QSqlDatabase::database("options");
  38. modelUsers = new QSqlTableModel(this,db);
  39.  
  40. modelUsers->setTable("users");
  41. modelUsers->select();
  42.  
  43. }
  44.  
  45. void LoginDialog::on_comboBoxUser_activated(int idx)
  46. {
  47. userPass.clear(); //Очищаем переменную с паролем...
  48.  
  49. //Получаем данные из модели
  50. userID = modelUsers->data(modelUsers->index(idx,0)).toInt();
  51. userPass = modelUsers->data(modelUsers->index(idx,2)).toString();
  52. }
  53.  
  54. void LoginDialog::on_buttonBox_rejected()
  55. {
  56. this->reject();
  57. }
  58.  
  59. void LoginDialog::on_buttonBox_accepted()
  60. {
  61. if(ui->comboBoxUser->currentIndex()>=0) {
  62. if(userPass==ui->lineEditPass->text().trimmed()) {
  63. qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText());
  64. this->accept();
  65. } else {
  66. ui->labelInfo->setText("Не верный пароль!");
  67. qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText());
  68. ui->lineEditPass->clear();
  69. }
  70. }
  71. }

Запускаем приложение. Появляется диалог входа в в программу. Если пароль не верен выводится сообщение. При вводе правильного пароля запускается основное окно программы.

Архив проекта
iMposCh005.zip iMposCh005.zip

Текущее состяние проекта здесь.

По статье задано0вопрос(ов)

2

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    22 ноября 2024 г. 21:51
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…