Чтение настроек приложения
Настройки приложения хранятся в таблице 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
Текущее состяние проекта здесь.