Читання налаштувань програми
Параметри програми зберігаються в таблиці 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
Поточне змагання проекту тут.