Read application settings
Application settings are stored in the options table of the iMpos.opt SQLite database.
To get and set options values, we create the Options class and implement the corresponding methods in it.
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(); } }
We include the options.h and logindialog.h header files in main.cpp and add the following code before calling the main window.
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; } }
We set the value of option 1000 to true for checking in the options table. We start the program.
The dialog is called, and when it is closed, the program ends.
Implementation of the user login dialog.
I want to pay attention to the creation of a bunch of signal-slot controls using Qt Designer.
Open our form, right click on the comboBoxUser object, select
Go to Slot...
. Select the activated(int) signal.
And immediately we get the implementation of the slot. All other manipulations are performed for us.
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(); } } }
We launch the application. The login dialog appears. If the password is not correct, a message is displayed. When you enter the correct password, the main program window starts.
Project archive
iMposCh005.zip
Current project status here.