Чтение настроек приложения
Настройки приложения хранятся в таблице options базы данных SQLite iMpos.opt.
Для получения и установки значений опций создаем класс Options и в нем реализуем соответствующие методы.
options.h
- #ifndef OPTIONS_H
- #define OPTIONS_H
- #include <QObject>
- #include <QSqlQuery>
- #include <QSqlError>
- #include <QVariant>
- class Options : public QObject
- {
- Q_OBJECT
- public:
- explicit Options(QObject *parent = nullptr);
- QVariant getOption(int optionID); //Получение значения опции
- void setOption(int optionID, QString value); //Установка значения опции
- signals:
- public slots:
- private:
- QSqlDatabase db; //База Данных
- };
- #endif // OPTIONS_H
options.cpp
- #include "options.h"
- #include "LoggingCategories/loggingcategories.h"
- Options::Options(QObject *parent) : QObject(parent)
- {
- //используем соедиенеие с базой данных options
- db = QSqlDatabase::database("options");
- }
- QVariant Options::getOption(int optionID)
- {
- QSqlQuery q = QSqlQuery(db);
- q.prepare("SELECT value FROM options WHERE option_id=:optionID");
- q.bindValue(":optionID",optionID);
- if(!q.exec()) {
- qCritical(logCritical()) << "Не удалось получить значение опции" << optionID << ".Причина" << q.lastError().text();
- return QVariant();
- }
- q.next();
- return q.value(0);
- }
- void Options::setOption(int optionID, QString value)
- {
- QSqlQuery q = QSqlQuery(db);
- q.prepare("UPDATE options SET value = :value WHERE option_ID = :optionID");
- q.bindValue(":optionID", optionID);
- q.bindValue(":value", value);
- if(!q.exec()) {
- qCritical(logCritical()) << "Не удалось обновить опцию" << optionID << "Причина" << q.lastError().text();
- }
- }
Подключаем в main.cpp заголовочные файлы options.h и logindialog.h и добавляем следующий код перед вызовом главного окна.
- Options opt;
- //Проверяем значение опции 1000
- if(opt.getOption(1000).toBool()){
- //Создаем диалогвое окно
- LoginDialog *loginDlg = new LoginDialog();
- loginDlg->exec();
- //Если вход не состоялся завершаем работу программы
- if(loginDlg->result() == QDialog::Rejected){
- QMessageBox::critical(nullptr,"Ошибка входа",
- "Не выполнен вход в систему!<br>Дальнейшая работа не возможна.");
- qCritical(logCritical()) << "Не выполнен вход в систему. Закрытие программы.";
- return 1;
- }
- }
Устанавливаем для проверки в таблице options значение опции 1000 равным true. Запускаем программу.
Диалог вызывается, а при его закрытии завершается работа программы.
Реализация диалога входа пользователя в систему.
Хочу обратить внимания на создание связки сигнал слот элементов упавления с применением Qt Designer.
Открываем нашу форму, правой кнопкой на объекте comboBoxUser, выбираем
Перейти к слоту...
. Выбираем сигнал activated(int).
И сразу попадаем реализацию слота. Все остальные манипуляции за нас выполнены.
- void LoginDialog::on_comboBoxUser_activated(int index)
- {
- }
logindialog.h
- #ifndef LOGINDIALOG_H
- #define LOGINDIALOG_H
- #include <QDialog>
- #include <QSqlTableModel>
- #include <QSqlRecord>
- #include <QSqlError>
- namespace Ui {
- class LoginDialog;
- }
- class LoginDialog : public QDialog
- {
- Q_OBJECT
- public:
- explicit LoginDialog(QWidget *parent = nullptr);
- ~LoginDialog();
- private slots:
- void on_comboBoxUser_activated(int idx);
- void on_buttonBox_rejected();
- void on_buttonBox_accepted();
- private:
- void createUI(); //Первоначальные настройки приложения
- void createModel(); //Создание модели пользователей
- private:
- Ui::LoginDialog *ui;
- QSqlTableModel *modelUsers; //Модель данных пользователей
- int userID; //ID выбранного пользователя
- QString userPass; //Пароль выбранного пользователя из базы данных
- };
- #endif // LOGINDIALOG_H
logindialog.cpp
- #include "logindialog.h"
- #include "ui_logindialog.h"
- #include "LoggingCategories/loggingcategories.h"
- LoginDialog::LoginDialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::LoginDialog)
- {
- ui->setupUi(this);
- createModel();
- createUI();
- }
- LoginDialog::~LoginDialog()
- {
- delete ui;
- }
- void LoginDialog::createUI()
- {
- //Очишаем информационное сообщение
- ui->labelInfo->clear();
- //Связываем модель и comboBox
- ui->comboBoxUser->setModel(modelUsers);
- //Устанавливаем отображение в comboBox столбца с номером 1
- ui->comboBoxUser->setModelColumn(1);
- //Текущий индекс -1 т.е. ничего не выбрано
- ui->comboBoxUser->setCurrentIndex(-1);
- }
- void LoginDialog::createModel()
- {
- //Используем соединение с базой данный options
- QSqlDatabase db = QSqlDatabase::database("options");
- modelUsers = new QSqlTableModel(this,db);
- modelUsers->setTable("users");
- modelUsers->select();
- }
- void LoginDialog::on_comboBoxUser_activated(int idx)
- {
- userPass.clear(); //Очищаем переменную с паролем...
- //Получаем данные из модели
- userID = modelUsers->data(modelUsers->index(idx,0)).toInt();
- userPass = modelUsers->data(modelUsers->index(idx,2)).toString();
- }
- void LoginDialog::on_buttonBox_rejected()
- {
- this->reject();
- }
- void LoginDialog::on_buttonBox_accepted()
- {
- if(ui->comboBoxUser->currentIndex()>=0) {
- if(userPass==ui->lineEditPass->text().trimmed()) {
- qInfo(logInfo()) << QString("Пользователь: %1. Успешный вход в систему.").arg(ui->comboBoxUser->currentText());
- this->accept();
- } else {
- ui->labelInfo->setText("Не верный пароль!");
- qWarning(logInfo()) << QString("Пользователь: %1. Не верный пароль!.").arg(ui->comboBoxUser->currentText());
- ui->lineEditPass->clear();
- }
- }
- }
Запускаем приложение. Появляется диалог входа в в программу. Если пароль не верен выводится сообщение. При вводе правильного пароля запускается основное окно программы.
Архив проекта
iMposCh005.zip
Текущее состяние проекта здесь.