Ruslan Polupan
Ruslan Polupan19 липня 2019 р. 10:25

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

Читання налаштувань програми

Параметри програми зберігаються в таблиці 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 iMposCh005.zip

Поточне змагання проекту тут.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall15 листопада 2024 р. 06:03
Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 листопада 2024 р. 22:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 20:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 листопада 2024 р. 15:05
EVILEG-CORE. Використання Google reCAPTCHA 2001; 98 29 34 priligy buy
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 14:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 21:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 14:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах