Ruslan Polupan
Ruslan PolupanJuly 19, 2019, 10:25 a.m.

IMpos project. Part 005. Reading application settings. Implementation of the user login dialog to the system.

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 iMposCh005.zip

Current project status here.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
d
  • dsfs
  • April 26, 2024, 4:56 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
d
  • dsfs
  • April 26, 2024, 4:45 a.m.

C++ - Test 002. Constants

  • Result:50points,
  • Rating points-4
d
  • dsfs
  • April 26, 2024, 4:35 a.m.

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
G
GarApril 22, 2024, 5:46 a.m.
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil AcademicsApril 20, 2024, 7:45 a.m.
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasovApril 14, 2024, 6:41 a.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел ДорофеевApril 14, 2024, 2:35 a.m.
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrexApril 4, 2024, 4:47 a.m.
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Follow us in social networks